【问题标题】:Max call stack exceeded超出最大调用堆栈
【发布时间】:2014-02-10 12:28:04
【问题描述】:

我了解超出的最大调用堆栈是多少。但是,我的代码有解决方法吗?此外,会有一段时间它最终会停止循环,即 position > 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 个空格,然后下一个缩进是一个制表符。但是对于这个网站,你需要有 4 个空格来显示它的代码,所以我尽量减少浪费的时间,这样我就可以快速得到答案。但如果它确实影响到人们,我现在就改变它
  • 所以,当位置为 calc2 -> calc3 -> calc1?等等……
  • 当 position > counter1 时停止。
  • 如果它总是更少,例如0?

标签: javascript


【解决方案1】:

您应该避免递归并使用循环。像这样的:

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

【讨论】:

    【解决方案2】:

    位置的值只给一次,永不改变。

    然后您检查,if(position &lt;= counter1) 在每个呼叫 calc1calc2calc3 中相互呼叫:

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

    这显然会一直持续到堆栈空间用完为止。

    也许如果你增加position 而不是counter1 或者在位置大于计数器时继续调用,这个问题就会消失, 即

    if(position > counter1)
    

    你可能需要退后一步,想想你真正想要做什么。

    【讨论】:

    • 感谢您指出我粗心的错误。我实际上想增加 counter1 并执行代码,直到 counter1 超过位置。
    【解决方案3】:

    据我了解,您正在计算斐波那契数的总和?

    请参阅此Javascript Fibonacci 答案以了解如何更轻松且无需任何递归调用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-24
      • 2015-12-29
      • 2017-12-27
      • 2020-12-06
      • 2016-12-04
      • 2019-08-06
      • 1970-01-01
      • 2022-10-08
      相关资源
      最近更新 更多