2017-04-13 11 views
0
public static void main(String[] args) 
{ 
    String string="HelloWorld"; 
    char ch = string.charAt(string.length()-1); 
    maximum(string,ch,string.length()-2); 
} 

public static void maximum(String string,char ch,int length) 
{ 
    if(length==0) 
     return; 
    System.out.println(ch); 
    maximum(string,string.charAt(length),length-1); 
} 

それは再帰を使用して文字列を反転しますが、文字列全体が印刷されないのはなぜですか?

d 
l 
r 
o 
w 
o 
l 
l 

代わりの

d 
l 
r 
o 
w 
o 
l 
l 
e 
h 

なぜ印刷しますか?

+0

最大値は実際の目的を示していないため、あまり良い名前ではありません。文字列の最大値は、おそらくアルファベットの最も遠い文字である文字列の「最高」の文字になります。 –

答えて

4

ここで再帰を行うのは、実際に行うべきことではありません。しかし、これが学習の練習であると仮定すると、ここに2つの問題があります。

  1. インデックス0の文字を印刷する前に戻っています。
  2. 現在のインデックスは、次の再帰レベルの呼び出し中にのみ取得します。あなたのchの意味は常にインデックスの後ろに1つあります。

は多分ような何かを:

public static void main(String[] args) 
{ 
    String string="HelloWorld"; 
    maximum(string, string.length()-1); 
} 

public static void maximum(String string, int length) 
{ 
    System.out.println(string.charAt(length)) 
    if(length==0) 
     return; 
    maximum(string, length-1); 
} 
+0

長さパラメータを取らず、文字列の長さで最大値を呼び出すように最大オーバーロードさえできますか?public static void maximum(String string){maximum(string.length() - 1); } ' –

+0

すばらしいアドバイスでした。ありがとうございました –

2

これは論理の問題ではなく、コードの問題です。まず、各再帰で長さの値を表示することをお勧めします。それはうまくいけば問題を明らかにするでしょう。あなたは手でこれを行い、問題を見ることもできます。

全体として、変数lengthを一貫して扱っていません。再帰の前に、正しく1を引いて、最後の文字の0から始まるインデックス位置を取得します。しかし、最後から1文字しか取得していないにもかかわらず、再帰を開始するときにlengthを2減らします。そこでは、lengthの意味を残りの文字列の長さの代わりに最後の位置に変更しました。しかし、maximum()の中では、コードの一部の文字列の長さのように扱い、別の部分の最後の位置のように扱います。

どちらの方法でも、maximum()のコードを変更して、変数を一貫して処理する必要があります。あなたが選択した意味に応じて、最初に送信する引数の値をmaximum()に変更する必要があります。

+2

私は自分の答えを書くようになったので、他の人は良いコーディングアドバイスで答えました。この問題は再帰を必要とせず、効率的にセットアップすることに同意します。しかし、これは簡単な問題です。コードを書き直すことは、まず最初にロジックの問題が何かを理解するのに役立ちません。そのため、変数名の矛盾とその扱い方を強調します。 –

関連する問題