写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
简单递归
function fib(n){
if(n === 0 || n === 1) return n
return fib(n-1)+fib(n-2)
}
递归解法的主要问题在于:
- 调用栈不断的叠加
- 大量重复的计算
递归优化(尾递归)
funciton fib(n, pre, cur){
if(n === 0) return pre
if(n === 1) return cur
return fn(n - 1, cur, cur + pre)
}
console.log(Date.now())
console.log(fib(500, 0, 1))
console.log(Date.now())
//1649701210783
//1.394232245616977e+104
//1649701210786
递归优化(备忘录解法)
let fib = (function () {
let map = {}
return function (n) {
if (map[n]) return map[n]
if (n === 0) return map[0] = 0
if (n === 1) return map[1] = 1
return map[n] = fib(n - 1) + fib(n - 2)
}
})()
console.log(Date.now())
console.log(fib(500))
console.log(Date.now())
// 1649699946267
// 1.394232245616977e+104
// 1649699946271
动态规划
let fib = function(n){
let next = 1n, pre = 0n
for(let i = 0; i < n; i++){
[next, pre] = [next + pre, next]
}
return pre
}
console.log(Date.now())
console.log(fib(500))
console.log(Date.now())
// 1649699946271
// 139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125n
// 1649699946271
以上全部内容,如有疑问,欢迎指正。Good Luck!