1. 程式人生 > >通過尾遞歸避免棧溢出

通過尾遞歸避免棧溢出

use asc 避免 由於 pre javascrip sta 溢出 down

JavaScript中的遞歸即函數內調用函數自身,但遞歸是非常耗內存的,每一次調用都會分配一定的棧空間,達到一定的數量(具體看瀏覽器)便會溢出報錯。

function recursion (num) {
    if (num === 1) {
        return 1;
    }
    return num + recursion(--num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded

對於尾遞歸來說,由於只存在一個調用幀,所以永遠不會發生“棧溢出”錯誤。

'use strict';
function recursion (num, total = 0) {
    if (num === 1) {
        return total + 1;
    }
    return recursion(num - 1, total + num);
}
console.log(recursion(5)); // 15
console.log(recursion(1000)); // 500500
console.log(recursion(10000000)); // Uncaught RangeError: Maximum call stack size exceeded

實際上還是報錯了:D。

通過尾遞歸避免棧溢出