算法:JS求斐波那契数列的第n值 + 连环问:青蛙跳台阶

38 阅读1分钟

斐波那契数列

  • 用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));

递归 - 大量的重复计算

image.png

优化

  • 不要递归,用循环
  • 记录中间的结果
  • 时间复杂度为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)

!和斐波那契数列完全一样