来自codeacademy的javascript制作数组中的递归

时间:2016-12-01 22:18:01

标签: javascript arrays recursion

      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);

2 个答案:

答案 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 (复数,表示你从中得到一个数组):

&#13;
&#13;
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;
&#13;
&#13;

做得更紧凑:

&#13;
&#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;
&#13;
&#13;