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

时间:2012-06-20 22:39:14

标签: javascript recursion

我无法看到此递归调用中缺少的内容......

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.抱歉,我是一个菜鸟,但我很困惑......

4 个答案:

答案 0 :(得分:4)

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

1 *任何东西都是身份功能。它返回自己,而不是1。

答案 1 :(得分:2)

假设您执行power(2,4),它会进入else并返回2 * power(2, 3)。在它返回之前,它必须评估它返回的表达式,因此它power(2, 3)

再次进入elsereturn 2 * power(2,2)。同样在这里,它必须评估表达式。你继续这样做,直到你得到它只是返回1的基本情况。现在你进入第二层底部,然后可以返回,因为它只是2*1,所以它会进入下一个更高的位置等级,2*2*1等等,直到达到最高等级并给出答案。

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

答案 2 :(得分:1)

在堆叠上,你将有1 * b * b * b * b ... e次。当基本案例命中时,堆栈会展开并得到正确的答案。

答案 3 :(得分:1)

这是一个执行示例:

  

power = function(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

     

power = 4