2016-03-15 49 views
3

試圖讓我的斐波那契序列使用遞歸工作,但運行到錯誤maximum callstack exceeded使用遞歸的JavaScript斐波納契

代碼:

var genFib = function(count, limit, fibArray) { 
    if (count === undefined || count === null) { 
    var count = 0; 
    } 

    if (fibArray === undefined || fibArray === null) { 
    var fibArray = [0, 1]; 
    } 

    if (count === limit) { 
    console.log(fibArray); 
    return fibArray; 
    } 

    var pushFibNo = function(fibArray) { 
    fibArray.push(fibArray[fibArray.length - 1] + fibArray[fibArray.length - 2]); 
    return fibArray; 
    }; 

    // console.log(count++); 
    // console.log(limit); 
    // console.log(pushFibNo(fibArray)); 

    return genFib(count++, limit, pushFibNo(fibArray)); 

}; 

genFib(null, 50, null); 

三個console.logs朝底部登出正確的數字,但我仍然得到maximum callstack錯誤。

+0

在得到錯誤之前得到了多少個數字(aprox)? – Soren

+0

發現它 - 你不能在'count ++'作爲返回語句中的參數傳遞給底部,你必須傳入'count + = 1'。誰能解釋爲什麼? –

+0

看到我的答案在下面,你總是使用相同的計數。 – destoryer

回答

2
if (count === undefined || count === null) { 
    var count = 0; 
} 

你已經聲明瞭「count」。這將覆蓋count參數,並且if(count === limit)永遠不會被調用。

+1

這是錯誤的,第一次運行'count'後總是0.它不會被重新聲明。 – destoryer

+0

即使var在if語句內,javascript也會在任何情況下都認爲它已被聲明。儘管上述代碼也存在其他問題(請參閱其他解決方案) –

+0

但是,重新聲明變量並不會使其失去價值。 – destoryer

12

++的行爲在後綴和前綴表示法中有所不同。

MDN

如果操作數後使用後綴,與操作者(例如x ++),然後將其遞增之前返回該值。

如果在操作數之前使用前綴運算符(例如,++ x),則會在增加後返回該值。

這意味着您總是在遞增之前通過count,導致堆棧溢出。

解決您的問題,改變

return genFib(count++, limit, pushFibNo(fibArray)); 

return genFib(++count, limit, pushFibNo(fibArray)); 
+1

或只是'count + 1' ... – georg

0

的問題是,你用的是後置這一行

return genFib(count++, limit, pushFibNo(fibArray)); 

然後你總是叫溫控功能與「count」相同的值,如果你使用preoperator應該起作用。

return genFib(++count, limit, pushFibNo(fibArray));