斐波那契数列-循环实现

560 阅读1分钟

我们知道,斐波那契数列最简单的实现方式就是递归来实现,但是,当n的数值大于150,或者200(,或者更多一丢丢的数组,好一点的电脑性能)以上的时候,就会变的很卡

 // 递归实现:
 function fibonacci(n){
  if(n <= 0) return 0;
  if(n == 1) return 1;
  return fibonacci1(n-1) + fibonacci (n - 2)
}

下面,用迭代循环的方式实现

实现思路

  1. 用两个变量分别记录中间结果, n1记录n-1的结果, n2记录n-2的结果
  2. n1初始化为1, n2初始化为0, 循环的时候,将n1, n2整体向后移动
  3. 用res记录
// 0 1 1 2 3 5 8 13 21 ...
  function fibonacci(n){
    if(n <= 0) return 0;
    if(n == 1) return 1;
    let n1 = 1;
    let n2 = 0;
    let result = 0;
    console.time('testFibonacci')
    for(let i = 0; i<= n;i++){
      result = n1 + n2;
       // 记录中间值
       n2 = n1;
       n1 = result;
    }
    console.timeEnd('testFibonacci') // testForEach: 0.076ms
    return result;
  }
  
  // 测试
  console.log(fibonacci(9)) // 34
  // console.log(fibonacci(500)) // 1.394232245616977e+104
  

![image.png](p9-juejin.byteimg.com/tos-cn-i-k3… watermark.image?)

image.png

image.png

循环写法-时间消耗: image.png

扩展- 青蛙跳台阶问题

一只青蛙,一次可以跳1级,也可以跳2级 问:青蛙跳到n级台阶,总共有多少种方式?? 解题思路: 用动态规划分析问题

  • 要跳到1级台阶,就有1种方式f(1)=1
  • 要跳到2级台阶,就有1种方式f(2)=2
  • 要跳到n级台阶,就有1种方式f(n)=f(n-1) + f(n-2)

动态规划解题思路:1. 把一个大问题,拆解为多个小问题,逐渐级向下拆解 2. 用递归的思路去分析问题,再改为循环来实现 算法的三大思维: 贪心, 二分,动态规划

那么到这里,青蛙跳台阶代码实现,就跟斐波那契数列完全一样了