有人可以向我解释为什么以下递归函数的最终返回值是CORRECT吗?
function(factorial) {
if (n == 0)
return 1;
return n * factorial (n -1);
}
我理解递归,但我不明白为什么返回值是正确的结果,而不仅仅是1 ..如果我将返回值更改为2,那么它只是将因子的结果加倍。因此,无论我放入什么值,返回表达式都会成为阶乘函数累积结果的乘数。为什么会这样?如何存储因子函数的累积结果?所有回复都表示赞赏
答案 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)结构,每次都看到函数的执行及其返回值。执行完每一步后,弹出该块。现在,您可以看到先前调用的块返回到当前称为块的值。
注意:这里的块只是你的递归函数。