2017-07-10 5 views
-3

Ich habe in ein Problem geraten, wo es mir maximale Call-Stack-Größe überschritten hat. Dies wird an dieser Stelle wirklich verwirrend, da ich einen Basisfall habe.Javascript: Maximale Call-Stack-Größe überschritten Fehler

<body> 
    <input type="text" id="Input"> 

     <script language='javascript'> 
     var input = document.getElementById("Input").value; 
     var n = parseInt(input); 

     function fib(n){ 
      if(n <= 1) 
      { 
       return 1; 
      } 
      else 
      { 
       return fib(n-2) + fib(n-1); 
      } 
     } 


    </script> 

    <button onclick= "fib(n)">aButton </button> 

</body> 
+1

Übergeben Sie den Wert der Eingabe * als Argument *, nicht innerhalb der Funktion ... – Li357

+2

Nach Ihrer Bearbeitung macht Ihre Funktion weniger Sinn als zuvor. Bitte posten Sie den ** echten ** Code, der Probleme verursacht. Wenn das Update wirklich korrekt ist, besteht das Problem darin, dass die Funktion keinen Parameter hat und den Startwert von "n" bei jedem Aufruf von der Benutzereingabe neu lädt. – Pointy

+0

Entschuldigung, ich habe meine Codierung bearbeitet, während ich diese Frage gestellt habe, werde ich die neueste posten. –

Antwort

1

Ihr Code hat einen kleinen Fehler, der dazu führt, dass die Funktion unendlich aufgerufen wird.

Als Basisfall, statt Test n < 2, versuchen n<=1, wie folgt aus:

function fib(n){ 
    if(n <= 1) 
    { 
    return 1; 
    } 
    else 
    { 
     return fib(n-1) + fib(n-2); 
    } 
} 

Ansonsten geht es weiter fib() anrufen, ohne jemals den Basisfall auslösende!

Hoffe es hilft!

EDIT

In Ordnung! Nachdem Sie Ihren Code bearbeitet sehe ich einen weiteren großen Fehler, den Sie hier haben ...

var n = parseInt(document.getElementById("Input").value)

Ruft den Eingabewert jedes Malfib() genannt wird. Dies bedeutet, dass Sie niemals zulassen, dass der Basisfall jemals aufgerufen wird! Stattdessen wird fib() aufgerufen und n wird jedesmal auf den ursprünglichen Wert initialisiert.

Stattdessen versuchen so etwas wie:

var n = parseInt(document.getElementById("Input").value); 
function fib(n){ 
     if(n <= 1) 
     { 
     return 1; 
     } 
     else 
     { 
      return fib(n-1) + fib(n-2); 
     } 
    } 
document.write(fib(n)); 

EDIT 2

Try this:

<script language='javascript'> 
     function runfib() { 
      var input = document.getElementById("Input").value; 
      var n = parseInt(input); 
      document.getElementById("demo").innerHTML = fib(n); 
     } 

     function fib(n){ 
      if(n <= 1) 
      { 
       return 1; 
      } 
      else 
      { 
       return fib(n-2) + fib(n-1); 
      } 
     } 
</script> 
<body> 
    <input type="text" id="Input"> 
    <button onclick= "runfib()">Get My Fib #!</button> 
    <p id="demo"></p> 

</body> 

Es verwendet eine Hilfsfunktion runfib() genannt. Sie haben versucht, unter anderen Fehlern fib() ohne Parameter aufzurufen.

Dieser Code wurde getestet und funktioniert. (Hier ist ein Fiddle)

+0

Beachten Sie die Änderung. Es ist jetzt alles anders. – Pointy

+0

Oh jeez ... Ja, das ändert die Dinge – cosinepenguin

+0

immer noch die gleiche Fehlermeldung –

0

Versuchen Sie fib memoizing:

var fib = (function(){ 
    var memo = [0,1]; 

    return function fib(n) { 
    var result = memo[n]; 

    if (typeof result === 'number') { 
    return result; 
    } else { 
    memo[n] = fib(n-1) + fib(n-2); 
    result = memo[n]; 
    } 
    return result; 
    } 
})(); 

Es wird exponentiell die Anzahl der Berechnungen abgeholzt. Ich lief fib (400) und es hat gut funktioniert.

Verwandte Themen