2014-02-10 69 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答案,学习如何做到这一点很容易,没有任何递归调用

相关问题