在下面的代码中,我完全了解它是如何工作的,直到终止和'返回1'。我假设一旦函数终止它应该输出1但是它会做你期望的指数程序做的事情,它输出正确的答案,在这种情况下是9。</ p>
我的问题是为什么会这样?
我假设我可视化递归的方式是不正确的(也许我对堆栈如何处理递归的想法?)I found a similar question to mine here但是这对我的理解没有帮助。
function power(base,exponent){
if(exponent === 0){
return 1 // Terminates with return 1 but output is correct
}
return base * power(base, exponent-=1);
}
power(3,2)//输出9而不是1.为什么?
答案 0 :(得分:4)
递归函数的工作原理如下:
首先,该函数将返回3 * power(3, 1)
。
现在你只是在右边调用这个函数,所以只有那个值必须解析才会变成。
3 * 3 * power(3,0)
同样只有最正确的部分是必须解决的功能。
所以它会是:
3*3*1
没有更多功能可以使用,因此第一个功能为您提供9
的结果。
它类似于
var x = multiple(3,1) * multiple(3,2) * multiple (3,4);
现在所有这些功能都将从左到右执行。
因此,一旦所有函数被重新分配,x的值将被计算。
答案 1 :(得分:2)
对于递归算法,必须至少有一个基本情况;递归最终将达到基本情况。你的基本情况是1
,然后base * power(base, exponent-1)
递归,直到它遇到基本情况,此时它会留下return base * 1
,即base
,然后堆栈将解开,直到它返回结果。
要显示power(3, 3)
的递归,您可以先写下该过程:
3 * power(3, 2)
3 * power(3, 1)
3 * power(3, 0)
现在上去并替换从基本情况(最后一行)开始的递归调用。
3 * power(3, 2)
3 * power(3, 1)
3 * power(3, 0) = 3 * 1 = 3
// we know power(3, 0) = 1; this is the base case
现在进行结果以对其余部分执行相同操作,直到获得最终值:
3 * power(3, 2) = 3 * 9 = 27
3 * power(3, 1) = 3 * 3 = 9
3 * power(3, 0) = 3 * 1 = 3