c # возвращаемое значение в рекурсивном методе - PullRequest
1 голос
/ 07 ноября 2011

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

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

Ответы [ 4 ]

11 голосов
/ 07 ноября 2011

Возвращает 1 в момент, когда Input == 1.

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

Попробуйте посмотреть, что происходит, когда вы звоните 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
4 голосов
/ 07 ноября 2011

Просто проработайте простой пример: Recursive (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
2 голосов
/ 07 ноября 2011

Возвращается факториал Input.

Рекурсия является распространенным методом решения многих типов задач.Согласно Википедии :

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

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

enter image description here

2 голосов
/ 07 ноября 2011

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

...