我目前正在研究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];
}
}
答案 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]