Dies ist ein guter. Rekursion kann deinen Kopf zum Drehen bringen. Der Grund ist, dass es nicht definiert ist, weil nicht alle Iterationen einen Wert zurückgeben, und für diejenigen, die nicht undefiniert sind - genau wie wenn Sie eine Variable auf eine Funktion setzen, die keinen Wert zurückgibt.
Es wird jedoch mit Rekursion verwirrend, weil der Rückgabewert, den Sie in diesem Fall sehen, von der zuerst aufgerufenen und zuletzt abgeschlossenen Iteration stammt. Im Gegensatz zu einem normalen Methodenaufruf, bei dem die Ausführung der Methode abgebrochen wird und sie von wo auch immer zurückgegeben wird, hat die Rekursion immer noch ihren Weg durch den Aufrufstapel zurück und gibt alle Werte zurück, die zurückgegeben werden müssen, einschließlich undefiniert, im umgekehrten Fall Reihenfolge, in der sie angerufen wurden. Es gibt also Ihren console.log Aufruf vier Rückgabewerte: 15, undefined, undefined, undefined.
Da es synchron ist, kann console.log erst ausgeführt werden, wenn die aufgerufene Methode ausgeführt wird. Was es ausgibt, ist der letzte Wert, den es bekommt, oder undefiniert. Wenn Sie nach dem Methodenaufruf in Ihrem else-Block eine Rückgabe eingeben, erhalten Sie 5 oder den Wert von acc nach der ersten Iteration der 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);
return acc;
}
}
console.log(multiplyT(5,3,0));