1

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

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

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

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

4

4 回答 4

4

您有一个递归函数,当它“返回 1”时,它会返回堆栈帧并将 1 乘以它堆积的所有其他 b 变量。1*b*b*b...等

1*anything 是身份函数。它返回自己,而不是 1。

于 2012-06-20T22:41:16.340 回答
2

假设您这样做power(2,4),它将进入else并返回2 * power(2, 3)。在它可以返回之前,它必须评估它返回的表达式,所以它会power(2, 3).

else这又进入了return 2 * power(2,2)。同样的交易,它必须评估表达式。你继续这样做,直到你到达你的基本情况,它只是返回 1。现在你进入从底部开始的第二个级别,它可以返回,因为它只是2*1,所以它进入下一个更高的级别,这将是2*2*1依此类推,直到它到达最高级别并为您提供答案。

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

于 2012-06-20T22:46:53.827 回答
1

这是一个执行示例:

功率 = 函数 (2, 2)

2 与 0 不同,则返回 2*function(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

于 2012-06-20T22:48:43.000 回答
1

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

于 2012-06-20T22:41:49.517 回答