2011-11-07 4 views
1

С риском звучать глупо, почему следующий метод возвращает результат вместо значения 1, когда условный блок равен true?C# возвращаемое значение в рекурсивном методе

public long Recursive(int Input) 
{ 
    if (Input <= 1) 
     return 1; 
    else 
     return Input * Recursive(Input - 1); 
} 
+0

Что такое первоначальный вход? – Jay

ответ

11

Он возвращает 1 в точке, которая Input == 1.

Но 1 вернулось используются с предварительным вызовом, умноженный на Input, возвращаемое значение, которое используется с предварительным вызовом, умноженное на Input, возвращаемое значение, которое используется с предварительным вызовом, умноженным на Input , возвращаемое значение которого используется с предыдущим вызовом, умноженное на Input ... пока вы не вернетесь к первому звонку до Recursive.

Try, чтобы увидеть, что происходит, когда вы звоните Recursive со значением 3:

 
- input is not 1, so it calls Recursive with the value 2 
    - input is not 1, so it calls Recursive with the value 1 
    - input is 1, 1 is returned 
    - 2 * 1 is returned 
- 3 * 2 is returned 
+0

Я понимаю, ослепительно очевидно тоже. Спасибо, я соглашусь в 10. – Yoda

2

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

+3

Не изменен. Возвращается другое значение. –

2

Это возвращение факториала Input.

Рекурсия - это распространенная техника для решения многих проблем. Согласно Википедии:

«Рекурсия в информатике является методом, где решение проблемы зависит от решения небольших экземпляров одной и той же задачи подход может быть применена ко многим типам проблем, и. одна из центральных идей информатики ».

Следующий фрагмент кода схемы поможет вам понять, как работает рекурсия.

enter image description here

4

Просто работать на простом примере: Рекурсивный (2) работы

invoke Recursive(2) 
if(input <= 1) evaluates to false 
so the else block is executed and the return value is 2 * Recursive(2 - 1) 
invoke Recursive(1) 
if(input <= 1) evaluates to true 
so the return value of Recursive(2 - 1) is 1 
thus the return value of Recursive(2) is 2 * 1 = 2 

Давайте через другую: Рекурсивный (3)

invoke Recursive(3) 
if(input <= 1) evalues to false 
so the else block is executed adn the return value is 3 * Recursive(3 - 1) 
but we just showed Recursive(2) evaluates to 2 
so the return value of Recursive(3) is 3 * 2 = 6 
+0

Отличная разбивка рекурсии +1 – Yoda

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