4

这是一个硬件任务。我想要的答案/输出是正确的。我只是不明白为什么。如果幂函数与我正在检查的数字匹配,我希望输出为真。对于这些示例,我确实得到了正确的答案,但我不明白这个递归函数是如何工作的。

在这个函数的 else 中,我说的是 base * 函数本身。这甚至代表什么?怎么可能base * power(base, exponent - 1);连计算?它不应该只是转了一圈然后最终结束吗?

console.log(power(2,4) === 16);
console.log(power(2,3) === 8);
console.log(power(2,2) === 4);

var power = function(base, exponent) {
    if(exponent === 0) {
        return 1; 
    }
    else {
        return base * power(base, exponent - 1);
    }
};
4

4 回答 4

5

函数 power 返回一个整数,因此函数返回时base * <some_integer>是一个完全有效的表达式。追踪这些东西的最好方法是用笔和纸:

电源调用堆栈(2,4):

power(2, 4) = 2 * power(2, 3)
power(2, 3) = 2 * power(2, 2)
power(2, 2) = 2 * power(2, 1)
power(2, 1) = 2 * power(2, 0)
power(2, 0) = 1 <--base case

现在您所要做的就是将值替换为调用堆栈

power(2, 4) = 2 * 8 = 16
power(2, 3) = 2 * 4 = 8
power(2, 2) = 2 * 2 = 4
power(2, 1) = 2 * 1 = 2
于 2012-04-08T04:15:22.817 回答
0

使用 Javascript 的语法糖声明风格编写函数可能会有所帮助:

console.log(power(2,4) === 16);
console.log(power(2,3) === 8);
console.log(power(2,2) === 4);

function power(base, exponent) {
    if(exponent === 0) {
        return 1; 
    }
    else {
        return base * power(base, exponent - 1);
    }
};

如果需要,您还可以添加该行

console.log("power("+base+", "+exponent+")");

在函数的头部,观察递归调用序列。

于 2012-04-08T04:13:11.227 回答
0

每次递归调用都会减少指数,直到它等于0它将返回一个 constant1的位置,并且函数停止递归。

js小提琴

另外,如果这不是家庭作业,还有Math.pow():)

于 2012-04-08T04:16:11.753 回答
0

对于幂(2,4)的例子,我们有

  • 4 != 0 所以 else 执行,它执行 2*power(2,3)。
  • 3 != 0 所以 else 执行,它执行 2*power(2,2)。
  • 2 != 0 所以 else 执行,它执行 2*power(2,1)。
  • 1 != 0 所以 else 执行,它执行 2*power(2,0)。
  • 最后 0 == 0 所以它返回 1 并且它不执行另一个递归调用。

所以它通过调用返回到 2*power(2,0),我们知道 power(2,0) == 1。它返回为 2。然后它返回 2*power(2,1) 和我们知道 power(2,1) == 2,因为 [2*power(2,0)]。这返回为 4。


看到图案了吗?依此类推,直到我们回到 2*power(2,3) ==16 因为我们有 power(2,3) == 8 因为 [power(2,2) * power(2,1) * power(2 ,0) * 1]。希望这有帮助!

于 2012-04-08T04:28:40.363 回答