2015-12-22 2 views
-1

Я работал над проектом Эйлера проблемы 14: https://projecteuler.net/problem=14Sum приращение внутри публичного статического междунар не работает

Я попытался тестовый случай: Вот мой код:

public class problem015 { 

public static void main(String[] args) { 


    System.out.println(Collatz(13)); 

} 

public static int Collatz (int n){ 
    int sum = 1; 
    if (n == 1) 
     return sum; 
    if (n%2 == 0) { 
     sum ++; 
     return Collatz(n/2);    
    } 
    if (n%2 == 1){ 
     sum ++; 
     return Collatz(1 + (3*n)); 
    } 
    else return 0; 
} 

} 

Теоретически, это должно возвращать значение из 10, когда я проверил его с номером 13 (10 номеров в последовательности Collatz, см. ссылку). Однако он просто возвращает начальное значение, которое я присваиваю целой «сумме».

Любые идеи, почему?

EDIT: Я думаю, это потому, что каждый раз, когда он возвращается к функции Collatz, он сбрасывает значение «sum». Если это так, как я могу объявить значение «sum» самостоятельно?

+0

Чтобы ответить на ваш вопрос, просто передайте сумму в качестве аргумента в вызове функции. – Taelsin

+0

'sum' - это локальная переменная в' Collatz() ', поэтому при каждом вызове создается новая' sum' и инициализируется до 1. – Ramanlfc

ответ

1

Когда вы делаете рекурсивный вызов, вы никогда не переходите в «сумму», поэтому он не увеличивается.

Вы хотите, чтобы ваш базовый регистр (n == 1) возвращался 1. Каждый из других случаев должен возвращать 1 + Collatz (nextNumberInTheSequence).

+0

Даже если он это сделал, он переписывается 'int sum = 1' – redFIVE

+0

@TangledUpInBlue I не совсем понимаю, как это исправить. Не могли бы вы указать мне в правильном направлении? –

+0

@redFIVE yup, я понял, что (и отредактирован на этот счет.). Как это исправить? –

4

Не требуется sum.

public static int Collatz (int n){ 

    if (n == 1) 
     return 1; 
    if (n%2 == 0) { 
     return 1 + Collatz(n/2);    
    }else{ 
     return 1 + Collatz(1 + (3*n)); 
    } 

} 
+0

это сработало отлично, спасибо! Очень глупо со мной не думать об этом так. –

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