(非常简单的递归)我错过了什么

(VERY simple recursion) what am I missing?

本文关键字:错过了 什么 递归 非常 简单      更新时间:2023-09-26

我看不到我在这个递归调用中缺少什么......

var power = function(b, e)
{
    if (e===0)
    {
       return 1;
    }
    else
    {
       return b*power(b, e-1);
    }
};

第一个 if 语句用于捕获零幂的数字(那些总是等于 1)。但这也是基本情况,所以当 e(指数)达到 0 时,函数退出并给我留下正确答案。

这如何返回正确的数字而不是数字 1?每次,e 都会下降到 0,但它返回正确答案而不是 1。对不起,我是菜鸟,但我很困惑...

你有一个递归函数,当它"返回 1"时,它会回到堆栈帧中,并将 1 乘以它堆叠起来的所有其他 b 变量。 1*b*b*b... 等等。

1*任何东西都是恒等函数。它返回自身,而不是 1。

假设你做power(2,4),它将进入else并返回2 * power(2, 3)。在它可以返回之前,它必须计算它返回的表达式,因此它确实power(2, 3) .

这再次进入elsereturn 2 * power(2,2).同样的交易在这里,它必须评估表达式。你一直这样做,直到你到达你的基本情况,它只返回 1。现在你进入倒数第二层,它可以返回,因为它只是2*1,所以它会进入下一个更高的层次,这将是2*2*1的,依此类推,直到它到达最顶层并给你答案。

有关更多解释,请参阅此SO(同一问题)。

在堆栈上,您将有 1*b*b*b*b... e 次。当基本情况命中时,堆栈展开,您得到正确答案。

下面是

一个执行示例:

功率 = 功能(2, 2)

2

与 0 不同,则返回 2*函数(2, 1)

   -> 1 is different of 0, then return 2*function(2, 0)
           -> 0 equal 0 return 1
   -> return 2*1
返回 2*

2*1

功率 = 4