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));

}

プロジェクト オイラー問題 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 のすべてのべき乗に対しては正常に動作しますが、他のものに対しては失敗します。

これはおそらく私の愚かな間違いです。とはいえ、それは私にとって問題です。

4

1 に答える 1

9

詳しくは調べていませんが、以下のように思われます。

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

実際には次のようにする必要があります。

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

その後、メソッドの最後の 2 行は到達できないため、完全に削除できるはずです。

于 2012-04-18T12:40:20.053 に答える