2016-01-20 135 views
0

有人可以向我解释为什么从下面的递归函数的最终返回值是正确的?JavaScript函数'返回'值?

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

我了解递归,但我不明白为什么返回值,而不是仅仅1的正确结果,..如果我改变返回2,那么它只是双打阶乘的结果。所以看起来,无论我在这个回归表达式中的任何价值成为阶乘函数累积结果的乘数,为什么这样呢?阶乘函数的积累结果如何存储?所有回复赞赏

+5

从您的评论看来,你真的不明白递归。认真思考。如果你输入'3',会发生什么? (提示:它会返回3 * 2 * 1,因为它是返回3 *因子(2),它是'返回3 *(2 *因子(1))' – slebetman

回答

-1

绘制一个堆栈(先进后出)结构,并看到你的函数执行与返回值每次。在执行完每一步之后,从其中弹出块。现在您可以看到之前调用的块返回到当前调用的块的值。

注意:这里的块不过是你的递归函数。

3

这样

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

n = 3只是dry-run的方法,并factorial(3)被调用时,它会经过4递归(函数调用factorial(n)

递归1 N = 3 ,第2行条件失败,因此它进入第4行并返回3 * factorial(2)

递归2 n = 2时,第2行条件失败,因此转到第4行,并返回2 * factorial(1)

递归3 n = 1时,第2行条件失败,因此转到第4行,并返回1 * factorial(0)

递归4 n = 0,第2行条件现在成功,所以它转到第3行并返回1。现在它将返回递归3中的函数调用,它将用1 * 1代替1 * factorial(0),并在返回到第一次递归调用并返回单个值时最终返回3 * 2 * 1 * 1

这意味着如果您在第2行返回2,则所有事情都会与2相乘。

简单是吧:)

2

试想输入作为5.Then第一个函数调用的最终结果会是怎样,

市价修改@ gurvinder372的评论:

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

不应该是'return 5 *(返回4 *(返回3 *(返回2 *(返回1 *(返回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 

干杯!