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, но не подходит для других.
Это, наверное, глупая ошибка с моей стороны. Тем не менее это проблема для меня.
Я думаю, что вам просто не хватает возврата для второго вызова, который у вас есть findChainLength (в блоке else) – daveb
Первое правило использования рекурсии - это не использование рекурсии. Второе правило использования рекурсии - не использовать рекурсию. – Neil