I want a recursive function that returns the powers of a number and stores each of them in an array called *stack*.
换句话说,每次执行递归时,都会向堆栈添加一个新值。
例如,如果我们调用power(3, 3)
,我们的堆栈应该以元素[3, 9, 27]
结束。
但是,此代码的结果是27而不是数组。我的错是什么?
// Create an empty array called "stack"
var stack = [];
// Here is our recursive function
function power(base, exponent) {
// Base case
if ( exponent === 0 ) {
return 1;
}
// Recursive case
else {
stack[exponent - 1] = base * power(base, exponent - 1);
return stack[exponent - 1];
}
}
power(3,3);
答案 0 :(得分:1)
您的代码没有问题。唯一的问题是返回值。 你可以在下面看到(顺便说一下,我把你的代码缩小了一点)
var task = (() => {
var stack = [];
function power(base, exponent) {
return (exponent && (stack[--exponent] = base * power(base, exponent))) || 1;
}
power(3, 3);
return stack;
});
console.log(task());
我个人并不喜欢递归电话,除非有“必须”的情况,否则我不喜欢使用该模式。
所以,在你的情况下(让我们忘记它是来自codeacademy并让我们认为它是一种真实的情况)使用递归函数不是强制性的。
有很多方法可以达到相同的效果。
例如,classic for循环:
function power(base, exp){
var result = [];
for(var i=1; i<=exp; i++){
result.push(Math.pow(base, i));
}
return result;
}
console.log(power(3, 3));
或者,ES6发电机(可能?)
function *power(base, exp){
let prev = 1;
for(var i=0; i<exp; i++){
yield prev *= base;
}
}
console.log([...power(3, 3)]);
答案 1 :(得分:0)
确实,你不会返回阵列,而是最后计算的产品。实际上,您要查找的结果会在通话结束后存储在堆栈中。
但是让一个全局变量被函数变异是不好的做法。而是为它创建一个所谓的闭包,并将其命名为 powers (复数,表示你从中得到一个数组):
function powers(base, exponent) {
// Create an empty array called "stack"
var stack = [];
// Here is our recursive function
function power(base, exponent) {
// Base case
if ( exponent === 0 ) {
return 1;
}
// Recursive case
else {
stack[exponent - 1] = base * power(base, exponent - 1);
return stack[exponent - 1];
}
}
power(base, exponent);
return stack;
}
console.log(powers(3,3));
&#13;
做得更紧凑:
function powers(base, exponent) {
var stack = [];
(function power(exponent) {
return +!exponent || (stack[--exponent] = base * power(exponent));
})(exponent);
return stack;
}
console.log(powers(3,3));
&#13;