2015-02-19 4 views
-3

Значение a равно 6. Ответ 12. Как это делается?Как проследить эти следующие коды? используя рекурсию?

if (a==0) 
     return 1; 

    return (a*a)/addxy(a-1) 

И это значение a равно 20. Как получается 11 произведено? Он должен быть отрицательный ответ, так как он становится как 20-19-18-17 -... и так далее

if (a==0) 
     return 1; 

    return a-addxy(a-1); 

Я не понимаю, как это делается. PS: Я читал рекурсии в java, как тысячу раз. Все еще не получилось. Кто-то, пожалуйста, помогите.

+0

Что функция addxy делать? –

+0

его имя метода !!!!!! –

+1

Используйте отладчик, или какой-нибудь println –

ответ

1

Предполагая, что это ваш метод addxy

int addxy(a){ 
    if (a==0) 
     return 1; 

    return (a*a)/addxy(a-1) 
} 

Вы рекурсии и получается, что это то, что расчет оказывается.

(6 * 6)/((5 * 5)/((4 * 4)/((3 * 3)/((2 * 2)/((1 * 1)/(1))))))

Хорошо, теперь, чтобы показать вам, почему это так. Это стек, который будет создаваться при вызове его:

a=6: (6*6)/(a=5) 
a=5: (5*5)/(a=4) 
a=4: (4*4)/(a=3) 
a=3: (3*3)/(a=2) 
a=2: (2*2)/(a=1) 
a=1: (1*1)/(a=0) 
a=0: 1 

Так вот что стек выглядит, когда он попадает в базовый случай, теперь палить стек, пока вы не сделали.

a=6: (6*6)/(a=5) 
a=5: (5*5)/(a=4) 
a=4: (4*4)/(a=3) 
a=3: (3*3)/(a=2) 
a=2: (2*2)/(a=1) 
a=1: (1*1)/1 

a=6: (6*6)/(a=5) 
a=5: (5*5)/(a=4) 
a=4: (4*4)/(a=3) 
a=3: (3*3)/(a=2) 
a=2: (2*2)/1 

a=6: (6*6)/(a=5) 
a=5: (5*5)/(a=4) 
a=4: (4*4)/(a=3) 
a=3: (3*3)/4 // This is (9)/4, so integer division will happen 

a=6: (6*6)/(a=5) 
a=5: (5*5)/(a=4) 
a=4: (4*4)/2 // Note the integer division that happened to get 2 

a=6: (6*6)/(a=5) 
a=5: (5*5)/8 

a=6: (6*6)/3 

a=6: 12 
+0

отлично !!! но как работает второй код? –

+0

Не слишком сложно адаптировать этот ответ ко второму коду? также пахнет домашним заданием для меня .. – dehlen

+1

Я не являюсь задней частью учебника. Я показал вам, как сделать один пример. Если вы это понимаете, вы должны быть способны сделать еще одно. Если вы не понимаете, тогда вы должны задавать вопросы о тех частях, которые не имеют смысла. –

0

Так это ваш метод addxy

int addxy(a){ 
    if (a==0) 
     return 1; 

    return (a*a)/addxy(a-1) 
} 

Для входа: addxy (3);

Выход

addxy(3) : will return (3*3)/addxy(2); 
addxy(2) : will return (2*2)/addxy(1); 
addxy(1) : will return (1*1)/addxy(0); 
addxy(0) : will return (1); 

Теперь трассировку:

(1*1)/1=1 <-------Since addxy(0) is 1 
(2*2)/1=4 <------- Since return (1*1)/addxy(0); is 1 
(3*3)/4=2 <--------- Since Integer Division so no decimal . 

Конечный результат:

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