斐波那契数列是以下一系列数字:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, ...
在种子数字 0 和 1 之后,后续的每一个数字都是前面两个数字之和。
斐波那契数列的一个有趣的性质是,数列的当前数字与前一个数字的比值无限趋近于黄金分割数, 1.61803398875…
你可以使用斐波那契数列来生成各种各样有趣的东西,比如黄金螺旋 (Golden Spiral),自然界中存在许多黄金螺旋。
斐波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数、费氏数列、黄金分割数列。
在数学上,斐波那契数列是以递归的方法来定义:
F(0)=0, F(1)=1, n>1时,F(n)=F(n-1)+F(n-2)。
根据该规则,返回第n个斐波那契数。
递归法
function fibonacci(n) {
if(n === 0 || n === 1) {
return n;
}
console.log(`fibonacci(${n-1}) + fibonacci(${n-2})`)
return fibonacci(n - 2) + fibonacci(n - 1)
}
fibonacci(5)
思路:不断调用自身方法,直到n为1或0之后,开始一层层返回数据。
问题:使用递归计算大数字时,性能会非常低;另外,递归造成了大量的重复计算(很多函数执行了多次)。
数组缓存
从上面代码的 console 中可以看出,执行了许多相同的运算。如果我们对中间求得的变量值,进行存储的话,就会大大减少函数被调用的次数。
这是典型的以空间换时间。很明显,函数被调用的次数大大减少,耗时明显缩减。
let fibonacci = function() {
let temp = [0, 1];
return function(n) {