2012-04-18 6 views
0
public class EulerProblem14 { 

int chainLength=1; 
public int findChainLength(int number){ 
    System.out.println("number "+number); 
    System.out.println("Chainlength "+chainLength); 

    if(number==1){ 
     System.out.println("the number is finally 1 return chain length"); 
     return chainLength; 
    } 
    if(number%2==0){ 
     chainLength++; 
    return findChainLength(number/2); 
    } 
    else { 
     chainLength++; 
     findChainLength(number*3+1); 
    } 
    System.out.println("THIS SHOULD NOT BE EXECUTED"); 
    return -1; 
} 
public static void main(String args[]){ 

    System.out.println(new EulerProblem14().findChainLength(13)); 

} 

プロジェクトオイラーProblem 14を解いている間、私は私が前に直面したことがないのJavaのメソッドの戻り値に奇妙な問題に出くわしました。上記の方法では、数値が最終的に1のときはチェーンの数を返すべきです。しかし、これは入力13の出力です。のJava:メソッドの戻り

番号13鎖長1

番号40鎖長2

番号20鎖長3

番号10鎖長4

番号5鎖長5

番号16鎖長6

番号8鎖長7

番号4鎖長8

番号2鎖長9

数1鎖長10

数は、最終的に1リターン鎖長

あり、これはBEべきではありません実行済み

実行しないでください

-1

問題は、数は、それが何らかの形でそれをスキップして実行すべきではないコードとリターンを実行-1代わり= 10鎖長を返すの1になったときに最後の部分です。それは1,2,4,8のような2のすべての力に対してうまくいくが、他の人には失敗する。

これはおそらく私の愚かな間違いです。それにもかかわらず、それは私のための問題です。

+0

私はあなたがfindChainLength(elseブロック内にある)の2回目の呼び出しの戻り値を見逃していると思います。 – daveb

+0

再帰を使用する最初の規則は再帰を使用しないことです。再帰を使用する第2の規則は、再帰を使用しないことです。 – Neil

答えて

9

私は詳細に見ていないが、私はこれを疑う:

else { 
    chainLength++; 
    findChainLength(number*3+1); 
} 

は、実際にする必要があります:

else { 
    chainLength++; 
    return findChainLength(number*3+1); 
} 

あなたはその後、完全メソッドの最後の2行を削除することができるはずです彼らは到達できないので、

+0

あなたはそれを持っています!実際はそうです。 – DonCallisto

関連する問題