2012-04-18 3 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 возвращение длина цепи

Это не должно быть EXECUTED

ЭТО НЕ ДОЛЖНО БЫТЬ ВЫПОЛНИТЬ

-1

Проблема заключается в последней части, когда число становится 1 вместо возвращения длины цепи = 10 это как-то пропускает его и выполняет код, который никогда не должен быть выполнен и возвращает -1. Он работает отлично для всех мощностей 2, таких как 1,2,4,8, но не подходит для других.

Это, наверное, глупая ошибка с моей стороны. Тем не менее это проблема для меня.

+0

Я думаю, что вам просто не хватает возврата для второго вызова, который у вас есть findChainLength (в блоке else) – daveb

+0

Первое правило использования рекурсии - это не использование рекурсии. Второе правило использования рекурсии - не использовать рекурсию. – Neil

ответ

9

Я не смотрел подробно, но я подозреваю, что это:

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

должно быть на самом деле:

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

Затем вы должны быть в состоянии удалить последние две строки метода полностью , поскольку они недостижимы.

+0

У тебя это получилось! На самом деле. – DonCallisto

Смежные вопросы