2016-12-01 26 views
0
 I want a recursive function that returns the powers of a number and stores each of them in an array called *stack*. 

换句话说,每次执行递归时,都会将新值添加到堆栈中。在javascript中创建数组的递归,来自codeacademy

例如,如果我们调用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

请编辑您的代码中使用适当的indenta灰。阅读非常困难。 –

+0

我很感谢大家的时间和解决方案,但我投了我能理解的东西。其他代码,因为我是初学者,所以需要时间研究。谢谢!此外,自从我学习递归之后,它必须是递归,但仍然无法理解如何以及何时使用它,尽管我多次阅读了雄辩的javascript。 –

+0

我的意思是雄辩的JavaScript递归部分 –

回答

0

的确,您不返回数组,而是最后计算的产品。实际上,您要查找的结果在调用完成后存储在堆栈中。

但有一个全局变量被一个函数改变是不好的做法。相反,为它创建一个所谓的闭包,并把它权力(复数,以表示你从它那里得到一个数组):

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

更加有点紧凑:

function powers(base, exponent) { 
 
    var stack = []; 
 
    (function power(exponent) { 
 
     return +!exponent || (stack[--exponent] = base * power(exponent)); 
 
    })(exponent); 
 
    return stack; 
 
} 
 
console.log(powers(3,3));

1

还有为n o问题与您的代码。唯一的问题是返回值。 你可以看到下面的(顺便说一句,我已经过压缩你的代码点点)

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,让我们考虑它是一种真实的情况)使用递归函数并不是强制性的。

有很多方法可以实现上述相同的结果。

例如,经典的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)]);