美文网首页
斐波那契数列

斐波那契数列

作者: 转移到CSDN名字丹丹的小跟班 | 来源:发表于2021-03-30 09:43 被阅读0次

    一直以来很恐惧递归,就算使用也是懵懵懂懂,今天想到了斐波那契数列,顺便学习下递归

    斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(*n ≥ 2,n ∈ N

    1. 基础版

    function fibonacci(n) {
        if(n <= 0) {
            return 0
        }else if(n === 1) {
            return 1
        }else {
            return fibonacci(n - 1) + fibonacci(n - 2)
        }
    }
    

    该方法代码优美逻辑清晰,但是存在大量的重复计算。实际操作其实是将每个元素层级变成最低的数字1进行相加,所以运算量大。

    2. 循环版本

    function fibonacci(n) {
        if(n <= 1) {
            return n
        }
        let a = 0
        let b = 1
        for(let i = 2; i <= n; i ++) {
            [a, b] = [b, a + b]
        }
        return b
    }
    

    该方法代码逻辑清晰,且不存在大量的重复计算。实际操作其实是将变量变成数列位置前两位进行进行相加操作。

    3. 递归改良版

    function fib(n,a = 0,b = 1){
        if(n==0)  return a
        else return fib(n-1,b,a+b)
    }
    

    4. 记忆函数优化

    function memozi(fn){
      var r = {}
      return function(n){
        if(r[n] == null){
          r[n] = fn(n)
          return r[n]
        }else{
          return r[n]
        }
      }
    }
    var fibfn = memozi(function(n){
        if(n==0){
            return 0
        }else if(n==1){
            return 1
        }else{
            return fibfn(n-1) + fibfn(n-2)
        }
    })
    

    相关文章

      网友评论

          本文标题:斐波那契数列

          本文链接:https://www.haomeiwen.com/subject/fiubhltx.html