超出最大调用堆栈

时间:2014-02-10 12:28:05

标签: javascript

我理解超出的最大调用堆栈是什么。但是,我的代码是否有针对此的解决方法?此外,将有一段时间它最终将停止循环,即当位置>计数器1。

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;
    }
}

3 个答案:

答案 0 :(得分: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 :(得分:1)

位置的值只给出一次,但从未改变过。

然后,您可以在每个致电if(position <= counter1)calc1calc2的电话中calc3进行检查:

calc1 - &gt; calc2 - &gt; calc3 - &gt; calc1 - &gt; ...

这将一直持续到你的堆栈空间不足为止。

也许如果你增加position而不是counter1或者在位置大于计数器时保持呼叫,这个问题就会消失, 即。

if(position > counter1)

你可能需要退一步思考你真正想要做的事情。

答案 2 :(得分:0)

据我了解你正在计算斐波纳契数和?

请参阅此Javascript Fibonacci答案,了解如何更轻松地完成此操作并且无需任何递归调用