Eloquent JavaScript递归示例如何作为返回1终止,但仍然输出指数值

时间:2015-04-08 08:31:29

标签: javascript recursion

在下面的代码中,我完全了解它是如何工作的,直到终止和'返回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.为什么?

2 个答案:

答案 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