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のすべての力に対してうまくいくが、他の人には失敗する。
これはおそらく私の愚かな間違いです。それにもかかわらず、それは私のための問題です。
私はあなたがfindChainLength(elseブロック内にある)の2回目の呼び出しの戻り値を見逃していると思います。 – daveb
再帰を使用する最初の規則は再帰を使用しないことです。再帰を使用する第2の規則は、再帰を使用しないことです。 – Neil