2016-01-20 2 views
0

Может кто-нибудь объяснить мне, почему окончательное значение возврата из следующей рекурсивной функции ПРАВИЛЬНО?Значение функции «возврат» JavaScript?

function(factorial) { 
    if (n == 0) 
    return 1; 
return n * factorial (n -1); 
} 

Я понимаю рекурсию, но я не понимаю, почему возвращаемое значение является правильным результатом, а не только 1 .. Если изменить возвращение к 2, то это просто удваивает результат факториала , Поэтому кажется, что любое значение, которое я вкладываю в это выражение возврата, становится множителем для накопленного результата факториальной функции. Почему это так? Как сохраняется накопленный результат факториала? Все ответы оценены

+5

Из вашего комментария кажется, что вы действительно не понимаете рекурсии. Подумайте очень сложно. Что произойдет, если вы введете '3'? (подсказка: он будет 'return 3 * 2 * 1', потому что это' return 3 * factorial (2) ', который является' return 3 * (2 * factorial (1)) ' – slebetman

ответ

-1

Нарисуйте одну структуру стека (First In Last Out) и каждый раз смотрите на выполнение своей функции с ее возвращаемыми значениями. После выполнения каждого шага поместите блок из него. Теперь вы можете увидеть значения, возвращенные ранее называемым блоком, который теперь называется блоком.

Примечание: здесь блок - это не что иное, как ваша рекурсивная функция.

3

Просто dry-run метод, как это

function factorial (n) { //line 1 
    if (n == 0) //line 2 
    return 1;//line 3 
return n * factorial (n -1);//line 4 
} 

говорят n = 3 и factorial(3) вызывается, она будет проходить через 4 рекурсии (функция требует factorial(n))

рекурсии 1 п = 3 , состояние линии 2 выходит из строя, поэтому оно переходит в линию 4 и возвращается 3 * factorial(2)

рекурсии 2 п = 2, строка 2 условие не выполнено, так она переходит к строке 4 и возврата 2 * factorial(1)

рекурсии 3 п = 1, строка 2 условие не выполнено, так что идет в строке 4 и возврата 1 * factorial(0)

Рекурсия 4 n = 0, состояние линии 2 выполняется успешно, поэтому оно переходит к строке 3 и возвращает 1. Теперь он вернется к вызову функции в рекурсии 3 и заменит 1 * factorial(0) на 1 * 1 и, наконец, вернет 3 * 2 * 1 * 1 при возврате в первый вызов рекурсии и возвращает единственное значение.

Это означает, что если вы возвращаете 2 в строке 2, то все умножилось на 2.

Simple не так :)

2

Представьте ввод как 5.Then конечный результат вызова первой функции будет, как,

Отредактированы согласно @ gurvinder372 замечания:

return 5*(return 4 * (return 3 * (return 2 * (return 1 * (return 1))))) 
+0

Не должно быть' return 5 * (return 4 * (return 3 * (return 2 * (return 1 * (return 1))))) ', поскольку OP также проверяет' n = 0'? – gurvinder372

+0

Да. Спасибо, что указали это. :) – Raghu

2

Вы можете просто развернуть factorial(5).

  • factorial(5)
  • factorial(5) = 5 * factorial(4)
  • factorial(5) = 5 * 4 * factorial(3)
  • factorial(5) = 5 * 4 * 3 * factorial(2)
  • factorial(5) = 5 * 4 * 3 * 2 * factorial(1)
  • factorial(5) = 5 * 4 * 3 * 2 * 1 * factorial(0)
  • factorial(5) = 5 * 4 * 3 * 2 * 1 * 1
+0

Спасибо Frogatto - ваш разворачиваемый факториал и ответы выше действительно помогли! – Ozventurer

0

Спасибо за все ваши ответы, ребята - ответ Frogattos был, вероятно, тем, который действительно поднял мое понимание;

factorial(5) 
factorial(5) = 5 * factorial(4) 
factorial(5) = 5 * 4 * factorial(3) 
factorial(5) = 5 * 4 * 3 * factorial(2) 
factorial(5) = 5 * 4 * 3 * 2 * factorial(1) 
factorial(5) = 5 * 4 * 3 * 2 * 1 * factorial(0) 
factorial(5) = 5 * 4 * 3 * 2 * 1 * 1 

Cheers!