Warum würde eine Rückkehr nicht definiert, sondern Konsole.log int zurückgeben?
So, ich habe die folgende Funktion:
var multiplyT = function(a, b, acc) {
if (b == 0) {
console.log("BASE CASE: ", acc);
return acc;
} else {
b--;
acc = acc + a;
console.log("NOT THE BASE CASE: ", a,b,acc);
multiplyT(a, b, acc);
}
}
Es wird aufgerufen mit:
console.log(multiplyT(5,3,0));
Und gibt diese:
NOT THE BASE CASE: 5 2 5
NOT THE BASE CASE: 5 1 10
NOT THE BASE CASE: 5 0 15
BASE CASE: 15
undefined
Als Ausgabe. Was ich bin verwirrt über, warum die acc geben würde, den richtigen Wert für die Konsole.melden Sie aber "undefined" nach dem, was zurückgegeben wird.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein guter. Rekursion kann Sie Ihren Kopf drehen. Der Grund ist es undefined ist, weil nicht alle Iterationen einen Wert zurückgeben, und für diejenigen, die nicht erhalten Sie undefined -- das gleiche wie wenn Sie eine variable an eine Funktion, die keinen Wert zurückgibt.
Verwirrend mit Rekursion, obwohl, weil der return-Wert, den Sie sehen, in diesem Fall ist von der ersten genannten und letzten-iteration abgeschlossen. Im Gegensatz zu einem regulären Aufruf der Methode, wo die Rückkehr bricht die Ausführung der Methode -- sende es zurück nach aus, wo immer Sie kam, Rekursion noch hat der wind seinen Weg zurück durch die call-stack, der Rückkehr, was auch immer Werte es hat, zurück zu geben, einschließlich unbestimmt, in der umgekehrten Reihenfolge, in der Sie genannt wurden. So ist es in Wirklichkeit geben Sie Ihre Konsole.log-call vier Werte zurückgeben: 15, undefined, undefined, undefined.
Weil es synchron, Konsole.log kann nicht ausgeführt werden, bis die Methode, die aufgerufen wird, durchgeführt. Was es gibt ist der Letzte Wert, den es bekommt, oder nicht definiert ist. Wenn Sie den stick in eine Rückgabe nach dem Aufruf der Methode in Ihrem else-block, werden Sie sehen, erhalten Sie 5, oder der Wert von acc nach der ersten iteration der Funktion.
In deinem else-block sollte es werden
return multiplyT(a, b, acc);
Müssen Sie zurück aus dem else-block auch.
In Ihrem Fall, auch wenn der Wert von
acc
aktualisiert wird, der Wert ist mot zurückgegeben, wennb != 0
JS:
Die Sie aufrufen, die rekursiv die multiplyT Funktion, aber du bist nicht der Kontrolle der Rücksendung. Dann, multiplyT(5,3,0) gibt keinen Wert zurück in den ersten nennen und die Funktion undefined zurückgibt.
Es ist wahr, dass der Stapel ausgeführt wird, aber der erste Aufruf ist der wichtigere: es muss der Wert aus der rekursiven inneren Funktion zurückgegeben, die den endgültigen Wert.
Korrigieren Sie den code in den else-Zweig, so können Sie die Rückgabe des rekursiven Aufrufs:
Habe ich eine gute Lösung, um diese während der Arbeit auf einem meiner Projekte, in die ich Durchlaufen ein Komplexes JSON-Objekt wieder einige Daten auf der Suche nach der id.
Hier führen wir eine while-Schleife, um zu sehen, wenn die recursed Funktionsaufruf einen true-Wert zurückgibt oder nicht definiert ist. Wenn gibt etwas anderes als
undefined
es werden wieder die Daten.