斐波那契数列
- 用JS计算斐波那契数列的第n个值
- 注意时间复杂度
- 公式
- f(0) = 0
- f(1) = 1
- f(n) = f(n - 1) + f(n - 2)
递归
function fibonacci(n: number): number{
if (n <= 0) return 0;
if (n === 1) return 1;
return fibonacci(n-1) + fibonacci(n-2)
}
console.log(fibonacci(30));
递归 - 大量的重复计算
优化
- 不要递归,用循环
- 记录中间的结果
- 时间复杂度为O(n)
代码
function fibonacci(n: number): number {
if (n <= 0) return 0
if (n === 1) return 1
let n1 = 1 // 记录 n-1 的结果
let n2 = 0 // 记录 n-2 的结果
let res = 0
for (let i = 2; i <= n; i++) {
res = n1 + n2
//记录中间结果
n2 = n1
n1 = res
}
return res
}
console.log(fibonacci(10))
动态规划
- 把一个大问题, 拆解为多个小问题, 逐级向下拆解
- 用递归的思路去分析问题,再改为循环来实现
- 算法三大思维:贪心、二分、动态规划
连环问:青蛙跳台阶
- 一个青蛙,一次可以跳1级,也可以跳2级
- 问:青蛙跳到n级台阶,总共由多少种方式
用动态规划解决问题
- 要跳到1级台阶,就1种方式f(1) = 1
- 要跳到2级台阶,就2种方式f(2) = 2
- 要跳到n级台阶,f(n) = f(n - 1) + f(n - 2)
!和斐波那契数列完全一样