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

How does Eloquent JavaScript recursion example terminate as return 1 but still output exponential value

本文关键字:返回 指数 输出 递归 JavaScript 何终止 终止 Eloquent      更新时间:2023-09-26

在下面的代码中,我完全理解它是如何工作的,直到终止和"return 1"。我假设,一旦函数终止,它应该输出1,但它会按照指数程序的预期执行,它会输出正确的答案,在这种情况下是9。

我的问题是为什么会这样?

我认为我可视化递归的方式是不正确的(也许是我对堆栈如何处理递归的想法?)我在这里发现了一个与我类似的问题,但这对我的理解没有帮助。

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。为什么?

递归函数的工作原理如下:

首先,函数将返回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,然后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