我理解超出的最大调用堆栈是什么。但是,我的代码是否有针对此的解决方法?此外,将有一段时间它最终将停止循环,即当位置>计数器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;
}
}
答案 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)
,calc1
,calc2
的电话中calc3
进行检查:
calc1
- &gt; calc2
- &gt; calc3
- &gt; calc1
- &gt; ...
这将一直持续到你的堆栈空间不足为止。
也许如果你增加position
而不是counter1
或者在位置大于计数器时保持呼叫,这个问题就会消失,
即。
if(position > counter1)
你可能需要退一步思考你真正想要做的事情。
答案 2 :(得分:0)
据我了解你正在计算斐波纳契数和?
请参阅此Javascript Fibonacci答案,了解如何更轻松地完成此操作并且无需任何递归调用