为什么我需要在'stack'之后添加[exponent - 1]?

时间:2013-04-13 00:55:43

标签: javascript

我目前正在研究Javascript中的递归函数,并且在大多数情况下我理解递归是什么以及如何使用它,但我有一个问题:为什么我需要“为什么我需要添加[exponent - 1 ]'堆'之后?“这是代码:

var stack = [];

// Here is our recursive function
function power(base, exponent) {
    // Base case 
    if ( exponent === 0 ) {
        return 1;
    }
    // Recursive case
    else {
        //Why do I need [exponent - 1]?
        **stack[exponent - 1] = base * power(base, exponent - 1)**;
        return stack[exponent - 1];
    }
}

3 个答案:

答案 0 :(得分:1)

这是因为

power(any_number, 0) = 1, (constant)

stack[0] = power(any_number, 0) = 1,
stack[1] = any_number * stack[0],
stack[2] = any_number * stack[1],
stack[3] = any_number * stack[2],
...

这就是power()函数在数学中的作用。 数的幂为零(n ^ 0)= 1, 接下来,每一次力量都会在功率再乘以一次之前。

你理解吗?

修改

回答你的评论,你几乎可以从你所写的内容中理解。

就是这样:

n^0 = 1
n^1 = n * n^0 = n * 1
n^2 = n * n^1 = n * n * 1
n^3 = n * n^2 = n * n * n * 1
n^4 = n * n^3 = n * n * n * n * 1
...

每一个都是n * previous(//递归案例)

除了n ^ 0总是等于1并结束此功能。 (//基本情况)

现在更清楚了吗?

答案 1 :(得分:1)

数组是从[0, length - 1]编入索引的。如果我们没有减去0那么stack的第一个元素就是空的。 exponent案例中else总是大于0。

答案 2 :(得分:1)

你真的不需要它,试试:

var stack = [];

function power(base, exponent) {
    // Base case 
    if ( exponent === 0 ) {
        return 1;
    }
    // Recursive case
    else {
        //[exponent] instead of [exponent - 1]
        stack[exponent] = base * power(base, exponent - 1);
        return stack[exponent];
    }
}

但是,堆栈会有一个未定义的索引,所以你可以尝试

var stack = [];

function power(base, exponent) {
    // Base case 
    if ( exponent === 0 ) {
       stack[0] = 1;
    }
    // Recursive case
    else {
        //[exponent] instead of [exponent - 1]
        stack[exponent] = base * power(base, exponent - 1);
    }
    return stack[exponent];
}
alert(power(2,3));
alert(stack);
// stack is now [1, 2, 4, 8]