2016-07-02 13 views
0

Versuchen, JavaScript und Rückrufe zu lernen. Was fehlt mir hier? EDITEDFibonnaci Sequenz mit Callback in Javascript

var fibNumber = function(n, callback) 
{ 
    if (n < 2){ 
    return 1; 
    }else{ 
    return function(n-2) + function(n-1); 
    } 
    callback(n) 
} 
var n = console.log(prompt("An integer please: "); 
fibNumber(n, function(n) 
{ 
    console.log(n) 
}); 
+1

Sie rufen nie den Rückruf – flup

+0

Okay, ich würde die erste ersetzen: console.log (Ergebnis); mit Rückruf (Ergebnis); ? –

+0

Was denkst du 'a, b = b, a + b;' tut? Meintest du "[a, b] = [b, a + b];"? Außerdem scheint es ein wenig komisch, diese Zahlen als Argumente zu übergeben - ich würde vielleicht ein einzelnes Argument erwarten, "n", das heißt "gib mir die * n * te Fibonacci-Nummer". Was soll deine Funktion eigentlich tun? – nnnnnn

Antwort

0

Nicht in der Lage zu verstehen, was man, indem man Werte von x und y versuchen zu erreichen.

Wenn Sie nur fibonacci-Serie für die ersten N-Nummern drucken möchte, habe ich diesen Code geschrieben.

var fibNumbers = function(n, callback){ 

    var series = []; 

    var temp; 

    for (var i = 0; i <= n; i++){ 

     if(i == 0 || i == 1){ 

      temp = 1; 

     }else{ 

      temp = series[i-1] + series[i-2]; 

     } 


     series.push(temp); 

    } 

    callback(series); //calling the callback here with argument series array containing the series 

} 

fibNumbers(30, function(result){ 

    console.log(result); //will console log the series 

}); 
+0

Ihr Aufwand ist gut, aber funktioniert nur einmal gut. Wenn Sie wiederholen, werden Sie etwas irrelevant bekommen. –

+0

Können Sie bitte ausarbeiten? @mortezaT –

+0

Rufen Sie es erneut mit der gleichen Nummer wird der Fehler angezeigt. Sie schieben jeden Wert auf Array, ohne zu überprüfen, ob das existiert. –

0

Was hat sich geändert:

  • benannte Funktion fibNumber - nicht erforderlich.
  • fibNumber arbeitet als Verschluss für callback
  • benannte Funktion f. Die Ursprungsfunktion zur Berechnung der Fibonacci-Zahl.
  • Diese Funktion wird aufgerufen und dann zurückgegeben. Der Teil, an dem die Rekursion beginnt.
  • Innerhalb f wird eine Überprüfung vorgenommen und callback wird aufgerufen. Dann wird der Richtig-Ruf von f (function ist kein Name für eine Funktion) mit n - 2 und n - 1 gemacht. Das Ergebnis wird neu abgestimmt.
  • Sie versuchen, ein Ergebnis von console.log anstelle von prompt zurückzugeben. Das funktioniert nicht. Teilen Sie die beiden Teile in zwei Teile und weisen Sie den Zahlenwert n zu. Dann mache die Ausgabe.
  • Rufen Sie fibNumber mit dem Rückruf und geben Sie das Ergebnis aus.

function fibNumber(n, callback) { 
 
    function f(n) { 
 
     if (n < 2) { 
 
      return 1; 
 
     } else { 
 
      callback(n); 
 
      return f(n - 2) + f(n - 1); 
 
     } 
 
    } 
 
    return f(n); 
 
} 
 
var n = +prompt("An integer please: "); 
 

 
console.log(n); 
 
console.log(fibNumber(n, function (n) { console.log(n); }));

0

Einige Fragen:

  • Wie Sie immer eine return Anweisung ausführen, bevor der Anruf von callback erreichen, die nie ausgeführt werden sollen. Also, nicht zurückgeben, sondern das Ergebnis in einer Variablen speichern, dann callback aufrufen und dann diesen Wert zurückgeben.
  • Aufruf function ist nicht die richtige Syntax, Sie möchten stattdessen fibNumber aufrufen.
  • Wenn Sie fibNumber rekursiv aufrufen, geben Sie das callback Argument nicht an. Dies ist in Ordnung, aber Sie sollten dann testen, ob Sie dieses Argument vor dem Caling callback erhalten haben. Andernfalls erhalten Sie beim Aufruf von undefined eine Fehlermeldung.
  • In der Anweisung, in der Sie zur Eingabe auffordern, fehlt eine schließende Klammer.
  • console.log(prompt(...)) gibt den Eingabewert nicht zurück, zumindest nicht in allen Browsern. Führen Sie console.log(n) separat aus.
  • Sie konvertieren die Eingabe nicht in eine Zahl: Eingabe über prompt ist immer eine Zeichenfolge. Ohne diese Umwandlung wird der n < 2 Vergleich in der Funktion niemals wahr sein, und so würden Sie in eine unendliche Rekursion geraten.Übergeben Sie die Eingabe an eine Nummer mit dem Einheitsoperator +.
  • Kein Problem, aber es ist verwirrend, dass Sie in Ihrem Hauptcode n sowohl für den Eingang als auch für den Ausgang verwenden. Es ist besser, einen anderen Variablennamen dafür zu verwenden.

Hier wird der Code korrigiert:

var fibNumber = function(n, callback) 
 
{ 
 
    var result; // for temporary storage of value to be returned 
 
    if (n < 2){ 
 
    result = 1; 
 
    }else{ 
 
    // You cannot call "function", you need to call "fibNumber" 
 
    result = fibNumber(n-2) + fibNumber(n-1); 
 
    } 
 
    // Only call callback when it was provided 
 
    if (callback) callback(result); 
 
    // also return it: 
 
    return result; 
 
} 
 
var n = +prompt("An integer please: "); // cast input to number 
 
console.log('input: ', n); // don't use console.log to get `n`. 
 
fibNumber(n, function(result) // use different name 
 
{ 
 
    console.log('result: ', result) 
 
});

1

Wenn Sie Rückruf wollen nach der endgültigen Berechnung aufgerufen werden und die FIBO Serie mit bis zu dieser Zahl dann wäre dies eine sein von Ihre Wege zu gehen:

function fibo(n, callWithSeries) { 
 
    fibo.series = fibo.series || [1]; 
 

 
    fibo.f(n); 
 
    callWithSeries(fibo.series.slice(0, n + 1)); 
 
    return fibo.series[n]; 
 
} 
 

 
fibo.f = function(n) { 
 
    if (fibo.series[n]) 
 
    return fibo.series[n]; 
 
    if (n < 2) 
 
    return (fibo.series[n] = 1); 
 
    return (fibo.series[n] = fibo.f(n - 1) + fibo.f(n - 2)); 
 
}; 
 

 
var res = fibo(6, s => console.log(s)); 
 
console.log('result: ', res); 
 

 
res = fibo(2, s => console.log(s)); 
 
console.log('result: ', res);

+0

Es gibt ein Problem mit der Logik, Ihr Code gibt nicht die gewünschte Ausgabe –

+0

Ich änderte es ohne Test. Überprüfen Sie es jetzt jetzt. –

+0

Auch habe ich keine Sache bekommen. Sie sagten, dass es nicht nötig ist, die Serie jedes Mal zu berechnen. Sogar in Ihrem Code berechnet er bei jedem Funktionsaufruf (er führt den gesamten Prozess erneut durch). Wäre es großartig, wenn Sie das näher ausführen könnten? –