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));
}
プロジェクト オイラー問題 14を解決しているときに、Java のメソッド リターンでこれまで直面したことのない奇妙な問題に遭遇しました。上記のメソッドでは、数値が最終的に 1 の場合、チェーンのカウントを返す必要があります。しかし、これは入力 13 の出力です。
数 13 チェーンの長さ 1
数 40 チェーンの長さ 2
数 20 チェーンの長さ 3
数 10 チェーンの長さ 4
数 5 チェーンの長さ 5
数 16 チェーンの長さ 6
数 8 チェーンの長さ 7
数 4 チェーンの長さ 8
数 2 チェーンの長さ 9
番号 1 チェーンの長さ 10
数は最終的に 1 戻りチェーンの長さ
これは実行すべきではありません
これは実行すべきではありません
-1
問題は、 chainlength = 10 を返す代わりに数値が 1 になる最後の部分にあり、どういうわけかそれをスキップし、決して実行されるべきではないコードを実行し、 -1 を返します。1,2,4,8 のような 2 のすべてのべき乗に対しては正常に動作しますが、他のものに対しては失敗します。
これはおそらく私の愚かな間違いです。とはいえ、それは私にとって問題です。