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

}

在解决 Project Euler问题 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

问题出在最后一部分,当数字变为 1 而不是返回 chainlength = 10 它以某种方式跳过它并执行不应该执行的代码并返回 -1 。它适用于 2 的所有幂,例如 1,2,4,8,但对于其他幂则失败。

这对我来说可能是一个愚蠢的错误。尽管如此,这对我来说是个问题。

4

1 回答 1

9

我没有仔细看,但我怀疑这一点:

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

实际上应该是:

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

然后,您应该能够完全删除该方法的最后两行,因为它们无法访问。

于 2012-04-18T12:40:20.053 回答