grazie per il vostro tempo.Javascript i ++ troppa ricorsione, i + 1 ok in coda ricorsione
stavo imparando una funzione di Fibonacci e uno della risposta è qui sotto:
function fibonacci(n) {
return (function(a, b, i) {
return (i < n) ? arguments.callee(b, a + b, i + 1) : a;
})(1, 1, 1);
}
console.log(fibonacci(51))
Come l'arguments.callee è vietato in modalità rigorosa dopo ES5, così ho sostituirlo con un nome di funzione. Dopo di che, ho visto la parte i + 1, e la sostituisco con un i ++, che risulta troppo ricorsione.
function x(n){
return (function y(a, b, i){
return (i < n) ? y(b, a + b, i++) : a;
})(1,1,1)
}
console.log(x(51))
Dopo alcuni debug, ho scoperto che l'i + 1 funziona correttamente, mentre i ++ no.
Quindi, ho usato i ++ nel posto sbagliato o non ho capito affatto i ++?
Ancora una volta.
i + 1 doesnt modificare il valore di i, passa solo i + 1 come parametro. i ++ d'altra parte aumenta il valore di i. – doldt
Si noti che ES5 non ottimizza la ricorsione della coda. Strumenti come Babel lo ottimizzeranno in un loop per te. Qui http://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&playground=true&code=function%20fibonacci(n)%20%7B%0A%20%20%20%20return%20(function% 20f (a% 2C% 20b% 2C% 20i)% 20% 7B% 0A% 20% 20% 20% 20% 20% 20% 20% 20return% 20 (i% 20% 3C% 20n)% 20% 3F% 20f (b% 2C% 20a% 20% 2B% 20b% 2C% 20i% 20% 2B% 201)% 20% 3A% 20a% 3B% 0A% 20% 20% 20% 20% 7D) (1% 2C% 201% 2C% 201)% 3B% 0A% 7D% 0Aconsole.log (fibonacci (51)) –