美文网首页
斐波那契数列

斐波那契数列

作者: 转移到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