2015-02-15 4 views
1

Я видел этот код онлайн, но то, что я прошу, - это то, как программа придумала ответ 12?Как проследить рекурсию?

Я сделал трассировку программы, и я только придумал ответ 6.

Почему ответ 12?

Входы: a=6 и b=6.

Это код:

public static int addxy(int a, int b) 
{ 
    if (a==0) 
     return b; 
    else if (b==0) 
     return a; 
    else 
     return 1 + addxy(a, b-1); 
} 
+0

Тогда Вы сделали трассировку неправильно. –

ответ

1

Попробуйте подходя шаг за шагом:

addxy(6, 6) returns 1 + addxy(6, 5) 
addxy(6, 5) returns 1 + addxy(6, 4) 
addxy(6, 4) returns 1 + addxy(6, 3) 
addxy(6, 3) returns 1 + addxy(6, 2) 
addxy(6, 2) returns 1 + addxy(6, 1) 
addxy(6, 1) returns 1 + addxy(6, 0) 
addxy(6, 0) returns 6 
So, addxy(6, 1) returns 1 + 6 = 7 
So, addxy(6, 2) returns 1 + 7 = 8 
So, addxy(6, 3) returns 1 + 8 = 9 
So, addxy(6, 4) returns 1 + 9 = 10 
So, addxy(6, 5) returns 1 + 10 = 11 
So, addxy(6, 6) returns 1 + 11 = 12 
+0

Я все еще не понимаю !! он возвращает 1 и вызывает метод ..., который также равен 1 .. и почему у него есть addxy (6, 1), он должен быть addxy (6, 5), так что 6 + 5 = 11 .... я все еще не понимаю ... пожалуйста, помогите ... им так глупо .. –

0

Это

return 1 + addxy(a, b-1); 

возвращает 1 плюс результат вызова метода рекурсивного в то время как удален 1 из b. Это в основном означает, что он добавляет b.

Когда b является 0, вы возвращаете a.

else if (b==0) 
    return a; 

(Вы также вернуть b, когда a является 0.

Даже не трассировка ничего, вы можете сказать, что (с неотрицательными значениями для a и b) метод просто добавляет a и b и возвращает результат.

0

Посмотрите на return заявление

return 1 + addxy(a, b-1); 

У вас есть вызов функции в операторе return для той же функции. Это называется recursive function. Так как b не 0, он продолжает называть его снова n снова, но добавив 1 и вычитая b на 1. Это продолжается до b становится 0. Это 6 раз.И вот почему вы получите 1*6 + a = 6

Эквивалент исполнение будет

return 1 + addxy(6, 5); 
return 1 + 1 + addxy(6, 4); 
return 1 + 1 + 1 + addxy(6, 3); 
return 1 + 1 + 1 + 1 + addxy(6, 2); 
return 1 + 1 + 1 + 1 + 1 + addxy(6, 1); 
return 1 + 1 + 1 + 1 + 1 + 1 + addxy(6, 0); 
return 1 + 1 + 1 + 1 + 1 + 1 + 6; // Value of a = 6 
return 12; 
+0

так ответ 6 .... когда я запустил этот код его 12 !!! я до сих пор не понимаю –

+0

нет .. ответ 12 см. он добавляет все значения. значение остатка 6. –

+0

возвращает 1 плюс имя метода .... используя a = 6 и b = 5 сейчас .... затем он снова падает в том же выражении, чтобы добавить 1 и b = 4 .. и использует тот же оператор ... я все равно не получаю его ... im soooo stupid –

1
  • addxy (6,6)
  • 1 + addxy (6,5)
  • 1 + 1 + addxy (6 , 4)
  • 1 + 1 + 1 + addxy (6,3)
  • 1 + 1 + 1 + 1addxy (6,2)
  • 1 + 1 + 1 + 1 + 1 + addxy (6, 1)
  • 1 + 1 + 1 + 1 + 1 + 1 + addxy (6,0) = 12
+0

Что было не так в вышеупомянутом решении. скажите мне и зачем давать отметку -1? –

+0

им не тот, кто дает вам отметку -1 ... я не могу проголосовать или проголосовать .... –

+0

@RavenMaddison Извините. Но я хотел бы знать, кто дает Я прошу проголосовать без каких-либо оснований. В любом случае, это нормально. –

-1

Как @Mureinik ответ совершенным, но вы этого не поняли,

Так давайте начнем с очень простым примером расчета Факториала с помощью рекурсии:

public int factorial(int num){ 
    if(num==0) //break condition of Recursion Since 0! is always 1 
     return 1; 
    return num*fact(num-1); 
} 

Так вот Трассировка

factorial(4) return 4*factorial(3); 
factorial(3) return 3*factorial(2); 
factorial(2) return 2*factorial(1); 
factorial(1) return 1*factorial(0); 
factorial(0) returns 1; 

, сейчас трассировку это ответы, и это ниже изображение формируется

Recusrsion

Может быть, теперь вы можете понять это

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