2013-11-17 6 views
0

Метод предназначен для калькулятора и должен возвращать log2 (n). Все используемые методы (monus, который неправильно написан неправильно), ect) написаны правильно. s (n) просто добавляет один к n и p (n) вычитает один.Что не так с этим рекурсивным методом? (java)

Когда я вызываю метод в основном, он получает остаток справа, но всегда возвращает 0 для ответа. это меня смущает. Я уверен, что это связано с тем, что я повторно инициализирую ответ на 0 при каждом вызове метода, но не должен ли это иметь значение, потому что он всегда будет установлен в x до того, как он вернет что-нибудь?

x является частной статической переменной, которая была установлена ​​равной 0 вне метода.

public static long v(long n) 
{ 
    long answer =0; 

    if (power(2,x) > n) 
    { 
     x = p(x); 
     setRemainder(monus(n,power(2,x))); 
     answer = x; 
    } 
    else if(power(2,x) ==n) 
    { 
     setRemainder(0); 
     answer = x; 
    } 
    else 
    { 
     x = s(x); 
     v(n); 
    } 
    x=0;// reset x so it can be used again. 
    return answer; 

} 

Может мне кто-нибудь помочь?

+6

Вы рекурсию в позвонив по телефону 'v (N)', но вы никогда ничего с тем, что вы найдете делать. – Teepeemm

ответ

1

Вы должны изменить строку:

v(n); 

к:

answer = v(n); 

Прямо сейчас, если последний еще блок выполняется, переменная ответ не меняется - так это все еще 0.

+0

Большое вам спасибо, я изначально просто возвращал x напрямую, но потом понял, что мне нужно было использовать его для некоторых других методов, поэтому я возвращаю его в 0 и добавляю в переменную ответа, но я полностью посмотрел на это. – user3002620

0

Как указано в комментариях, вы делаете рекурсивный вызов в операторе else, но не присваиваете его чему-либо, когда возвращается рекурсивный вызов.

Рассмотрим это:

При первом вызове: x = 0 так, вероятно, будет заявление еще и ввести рекурсию. В какой-то момент рекурсии один из ваших условных операторов будет истинным, и в этом случае возвращается answer, но не назначается таким образом, чтобы вернуть стоп рекурсивных вызовов.

Так будет выглядеть следующим образом:

1: v(n) // this calls v(n) again 
    2: v(n) returns answer = x // this returns an answer 
    1: returns answer = 0 // now the return falls down a level to where the recursive 
         // call was and the answer is lost as was not assigned 
Смежные вопросы