Qualcuno può trovare problemi evidenti che mi manca qui?
fact
restituisce un iteratore, ma si stanno cercando di più con un numero di : n * fact(n-1)
. Non può funzionare!
Perché fact
restituisce un iteratore, ma anche voi volete moltiplicare l'ultimo valore del iteratore con n
(vale a dire che non è ricorsiva in coda), non si può semplicemente yield*
esso sia.
Hai bisogno di iterare esplicitamente sul risultato della chiamata interna, reemit il valore e ricordare l'ultimo valore in modo da poter più con esso:
function* fact (n) {
if (n < 2) {
yield 1;
} else {
let last;
for(last of fact(n-1)) {
yield last;
}
yield n * last;
}
}
Array.from(fact(5)); // [1, 2, 6, 24, 120]
Se si modifica la funzione di essere ricorsiva in coda, si sarebbe un po 'più breve (e più), ma il risultato sarebbe anche diverso (poiché eseguiamo le operazioni in ordine diverso, almeno in questa implementazione):
function* fact (n, acc=1) {
yield acc
if (n > 1) {
yield* fact(n-1, acc * n);
}
}
Array.from(fact(5)); // [1, 5, 20, 60, 120]
Personalmente appena scrivere non ricorsiva versione:
function* fact (n) {
let result = 1;
let i = 0;
while (i < n) {
yield result = result * ++i;
}
}
Array.from(fact(5)); // [1, 2, 6, 24, 120]
fonte
2016-05-12 06:57:29
Perché resa * 1 ??? –
Ok. Penso che sia sbagliato. Consentimi di aggiornarlo –
Non stai restituendo nulla .. e stai dicendo che questa è una chiamata ricorsiva. –