斐波那契数列:第n项等于前两项之和 : 0/1/1/2/3/5/8/13/21/34/....
如何获取斐波那契数列第N项的值?
我们很快可以想到 f(n) = f(n-1) + f(n-2),通过递归方法来实现我们的代码。
function badFibonacci(n) {
if (n <= 1) return 0
if (n == 2) return 1
return badFibonacci(n - 1) + badFibonacci(n - 2)
}
但其实通过递归实现并不是一个好办法,甚至可以说是一个很糟糕的实现,因为存在大量的重复计算。
例如获取第5个元素:
f(5)
= f(4) + f(3)
= f(2) + f(3) + f(1) + f(2)
= f(2) + f(1) + f(2) + f(1) + f(2)
= 1 + 0 + 1 + 0 + 1
= 3
其中,f(1)/f(2)/f(3)经过了多次的重复计算,使得效率大大降低。最好的方法还是存下每次计算所得的值。
function fibonacci(n) {
if (n <= 1) return 0
if (n == 2) return 1
if (n == 3) return 1
let f1 = 0
let f2 = 1
let f3 = f1 + f2
for (let i = 4; i <= n; i++) {
f1 = f2
f2 = f3
f3 = f1 + f2
}
return f3
}