谁能给我解释一下为什么下面的递归函数的最终返回值是正确的?
function(factorial) {
if (n == 0)
return 1;
return n * factorial (n -1);
}我理解递归,但我不明白为什么返回值是正确的结果,而不只是1..如果我将return更改为2,那么它只是将factorial的结果加倍。似乎无论我在返回表达式中放入什么值,都会变成阶乘function..Why的累加结果的乘数,是这样吗?阶乘函数的累加结果是如何存储的?感谢所有回复
发布于 2016-01-20 15:14:46
只需像这样对方法执行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,第二行条件现在成功了,所以它转到第三行并返回1。现在,它将返回到递归3中的函数调用,并用1 * 1替换1 * factorial(0),最后在返回到第一个递归调用时返回3 * 2 * 1 * 1,并返回单个值。
这意味着如果你在第2行返回2,那么所有内容都会与2相乘。
很简单,不是吗?)
发布于 2016-01-20 15:39:58
您可以简单地展开一个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发布于 2016-01-20 15:15:34
假设输入为5,那么第一个函数调用的最终结果将如下所示:
根据@gurvinder372的评论编辑:
return 5*(return 4 * ( return 3 * (return 2 * ( return 1 * ( return 1)))))https://stackoverflow.com/questions/34893555
复制相似问题