2014-02-10 97 views
0

我明白超出的最大調用堆棧是多少。但是,對於我的代碼是否有解決方法?此外,還有一段時間它最終會停止循環,也就是當位置> counter1時。超過最大調用堆棧

var a = 0; 
var b = 1; 
var c; 
var counter1 = 1; 
var position = 0; 

window.onload = function() { 
    var position = prompt("Please enter the position number.","0"); 
    calc1(); 
} 

function calc1() { 
    if(position <= counter1) { 
    c = a+b; 
     counter1++; 
     calc2(); 
    } 
    else { 
    callResult(); 
    } 
} 

function calc2() { 
    if(position <= counter1) { 
    a = b+c; 
    counter1++; 
    calc3(); 
    } 
    else { 
    callResult(); 
    } 
} 

function calc3() { 
    if(position <= counter1) { 
     b = c+a; 
    counter1++; 
    calc1(); 
    } 
    else { 
    callResult(); 
    } 
} 

function callResult() { 
    if (position %3 == 1) { 
    document.getElementById("answer").innerHTML = a; 
    } 
    else if (position %3 == 2) { 
    document.getElementById("answer").innerHTML = b; 
    } 
    else { 
    document.getElementById("answer").innerHTML = c; 
    } 
} 
+4

你怎麼* *永遠弄不清代碼流,如果這是你如何縮進代碼? – h2ooooooo

+1

這不是我通常的縮進方式。它通常是4個空格,然後下一個縮進是一個製表符。但是對於這個網站,你需要有4個空格來顯示它的代碼,所以我儘量減少浪費的時間,以便我可以快速得到答案。但是,如果它影響到人們,我現在就改變它 –

+2

因此,當位置<= counter1時增加counter1,但從不改變位置,所以計數器變得越來越大,從而保持調用calc1 - > calc2 - > calc3 - > calc1?等... – doctorlove

回答

4

您應該避免遞歸併使用循環。這樣的事情:

window.onload = function() { 
    var position = prompt("Please enter the position number.","0"); 
    maincalc(); 
} 

function maincalc() { 
    var subcalc = [ calc1, calc2, calc3 ]; 
    var calccount = 0; 

    while(position <= counter1) { 
     subcalc[ calccounter ](); 
     calccounter = (calccounter +1) % 3; 
    } 
} 
1

位置的值只給出一次,從不改變。

然後檢查,if(position <= counter1)在每次調用calc1calc2calc3其因此稱呼對方:

calc1 - >calc2 - >calc3 - >calc1 - > ...

這顯然繼續直到你用完堆棧空間。

或許,如果你增加的position代替counter1或保持通話,同時位置不是解決這一問題就會迎刃而解更大, 即

if(position > counter1) 

你可能需要退一步,想想你是真正試圖去做。

+0

謝謝指出我粗心的錯誤。我其實想增加counter1並執行代碼,直到counter1超過這個位置。 –

0

據我所知,你正在計算斐波納契數的和?

看到這個Javascript Fibonacci答案,學習如何做到這一點很容易,沒有任何遞歸調用

相關問題