2016-12-01 54 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)]);