JavaScript函数'返回'值?

时间:2016-01-20 07:06:10

标签: javascript algorithm recursion return

有人可以向我解释为什么以下递归函数的最终返回值是CORRECT吗?

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

我理解递归,但我不明白为什么返回值是正确的结果,而不仅仅是1 ..如果我将返回值更改为2,那么它只是将因子的结果加倍。因此,无论我放入什么值,返回表达式都会成为阶乘函数累积结果的乘数。为什么会这样?如何存储因子函数的累积结果?所有回复都表示赞赏

5 个答案:

答案 0 :(得分: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 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 * factorial(0)替换为1 * 1,并在返回第一个递归调用时最终返回3 * 2 * 1 * 1并返回单个值。

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

简单不是它:)

答案 1 :(得分:2)

想象输入为5.然后第一个函数调用的最终结果将是,

根据@ gurvinder372的评论编辑:

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

答案 2 :(得分: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

答案 3 :(得分: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

干杯!

答案 4 :(得分:-1)

绘制一个堆栈(First In Last Out)结构,每次都看到函数的执行及其返回值。执行完每一步后,弹出该块。现在,您可以看到先前调用的块返回到当前称为块的值。

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