2017-03-26 8 views
1

私は再帰的に以下のJavaコードを記述しようとしている:このJava関数を再帰的に書くにはどうすればよいですか?

public static int count(String word) { 
    int numValue = 0; 
    int length = word.length(); 
    for(int i=0; i<length; i++){ 
     String alpha = "abcdefghijklmnopqrstuvwxyz"; 
     String letter = (word.substring(0 + i,1 + i)); 
     numValue = numValue + alpha.indexOf(letter) + 1; 
    } 
    return numValue; 
    } 


public static void main(String[] args) { 
    System.out.println(count("abc")); 
} 

関数は、入力文字列パラメータで各文字のインデックスの合計を返します。

私はこの同じコードを習得してみようとしていますが、誰かが間違っている箇所を指摘できますか?

public static int count(int numValue, int i, String word) { 
    String alpha = "abcdefghijklmnopqrstuvwxyz"; 
    if(i >= word.length()){ 
     return numValue; 
    } 
    else{ 
     String letter = (word.substring(0 + i,1 + i)); 
     numValue = numValue + alpha.indexOf(letter) + 1; 
     count(numValue, i=i+1, word); 
    } 
    return numValue; 
} 

    public static void main(String[] args) { 
     System.out.println(count(0,0, "abc")); 
    } 
+0

反復可能な場合は、なぜそれが再帰的になりたいのですか?通常、これらのすべての再帰呼び出しよりもループを使用するほうが高速です。 –

+0

再帰関数は再帰呼び出しの値を格納したり、何もしません。 – UnholySheep

+0

ようこそ!デバッグの助けを求める質問( "なぜこのコードは動作しないのですか?")には、目的の動作、_a特定の問題またはerror_を含める必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) –

答えて

1

単純な方法では、文字列を何度も繰り返し縮めるだけです。

public static int count(String word) { 
    if (word.isEmpty()) { 
     return 0; 
    } 
    final String alpha = "abcdefghijklmnopqrstuvwxyz"; 
    return alpha.indexOf(word.charAt(0)) + count(word.substring(1)); 
} 
0

変数numValueはタイプintです。だから、それはあなたが別のメソッドに渡してそこで変更するまで、呼び出しメソッドで変更されません。つまり、count(numValue, i=i+1, word);行は基本的に何もしません。

あなたは再帰呼び出し(あなたがifに戻りますので、elseが必要とされていない)の結果を返す方法を修正することができます。

public static int count(int numValue, int i, String word) { 
    String alpha = "abcdefghijklmnopqrstuvwxyz"; 
    if(i >= word.length()){ 
     return numValue; 
    } 
    String letter = (word.substring(0 + i,1 + i)); 
    numValue = numValue + alpha.indexOf(letter) + 1; 
    return count(numValue, i=i+1, word); 
} 

これはあなたの機能が正常に動作しない理由、あります。 timrauによって提供される答えは、再帰のためのより良いソリューションです。

1

この関数を再帰的に変更するには、理想的には分割と征服のアプローチを使用します。これは実装が簡単です。私は、あなたがその手順をはっきりと見ることができるように、簡単で冗長な方法で提示します。

public static int count(String word) { 
    int numValue = 0; 
    int length = word.length(); 
    if(length > 1) 
    { 
     String substring1 = word.substring(0, length/2); 
     String substring2 = word.subtring(length/2 + 1, length); 
     numValue += count(substring1); 
     numValue += count(substring2); 
     return numValue; 
    } 
    else 
    { 
     String alpha = "abcdefghijklmnopqrstuvwxyz"; 
     return alpha.indexOf(word) + 1; 
    } 
} 

public static void main(String[] args) { 
    System.out.println(count("abc")); 
} 

私はあなたが自分で再帰を教えるために練習としてこれをやっていると仮定 - いない場合、あなたはあなただけの代わりに、再帰の反復的なアプローチを使用することは良くないか考えたいことがあります。

+0

else文のどこにも "letter"が表示されないので、これはコンパイルされません。 – user949300

+0

はい、そうです、私はタイプミスをしました。私はそれを編集しました - それをpoinitngしてくれてありがとう:) –

関連する問題