2014-02-10 8 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

위치 값은 한 번 주어지며 변경되지 않습니다. 각 호출 calc1, calc2에서

그런 다음 확인 if(position <= counter1), 따라서 서로를 호출 calc3 :

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

이 명확하게 계속 스택 공간이 부족할 때까지 당신이 position 대신 counter1의 증가 또는 위치는이 문제가 사라집니다 카운터보다 큰 동안 계속 전화 아마도 경우

, 즉

if(position > counter1) 

당신은 아마 다시 단계로 당신이 정말로 무엇인지에 대해 생각해야 하려고하는 것.

+0

내 부주의 한 실수를 지적 해 주셔서 감사합니다. Counter1이 위치 이상이 될 때까지 실제로 counter1을 증가시키고 코드를 실행하려고했습니다. –

0

나는 피보나치 수 합계를 계산하고있는 것으로 알고 있습니까?

Javascript Fibonacci 대답이 훨씬 용이하고 재귀 호출하지 않고 작업을 수행하는 방법을 배울 참조

관련 문제