Saisissez n et trouvez le nième terme de la séquence de Fibonacci
function fibonacci(n) { if (n < 0) { throw new Error('输入的数字不能小于0'); } if (n == 0) { return 0; } if (n == 1) { return 1; } return fibonacci(n-1) + fibonacci(n-2); }
Ce n'est en fait pas une très bonne méthode
Par exemple, lors de la recherche de fibonacci(10), il est décomposé en fibonacci( 9) et fibonacci(8), mais fibonacci(9) sera décomposé en fibonacci(8) et fibonacci(7), dans lesquels fibonacci(8) est calculé à plusieurs reprises, et ainsi de suite. est d'enregistrer Les valeurs calculées sont les suivantes :
function fibonacci2(n) { if (n < 0) throw new Error('输入的数字不能小于0'); let arr = [0, 1]; function calc(n) { if (n<2) { return arr[n]; } if (arr[n] != undefined) { return arr[n]; } let data = calc(n-1) + calc(n-2); arr[n] = data; return data; } return calc(n); } function fibonacciFunc() { let arr = [0, 1]; function calc(n) { if (n < 0) throw new Error('输入的数字不能小于0'); if (n<2) return arr[n]; if (arr[n] != undefined) { return arr[n]; } let data = calc(n-1) + calc(n-2); arr[n] = data; return data; } return calc; } let fibonacci3 = fibonacciFunc();
Les deux méthodes ci-dessus utilisent des fermetures
L'inconvénient de fibonacci3 est que tant que fibonacci3 n'est pas libéré, le tableau arr existera toujours dans la mémoire. Surtout après avoir calculé des nombres relativement grands ; mais lorsqu'un grand nombre de nombres de Fibonacci doivent être calculés, fibonacci3 sera plus avantageux, mais n'oubliez pas de libérer fibonacci3 à la fin, c'est-à-dire :
fibonacci3 = null;
Une autre méthode est Pas besoin de récursivité, il suffit de boucler directement
function fibonacci4 (n) { if (n < 0) throw new Error('输入的数字不能小于0'); let dataMinusTwo= 0, dataMinusOne = 1, data; if (n == 0) return dataMinusTwo; if (n == 1) return dataMinusOne; for (var i=2;i<=n;i++) { data = dataMinusOne + dataMinusTwo; dataMinusTwo = dataMinusOne; dataMinusOne = data; } return data; }
Ce qui précède est le contenu de l'implémentation JS de la séquence de Fibonacci. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (m.sbmmt.com) !