前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法:斐波那契数列 Fibonacci

算法:斐波那契数列 Fibonacci

作者头像
用户3578099
发布2022-06-10 15:41:49
4120
发布2022-06-10 15:41:49
举报
文章被收录于专栏:AI科技时讯AI科技时讯

斐波那契数列 Fibonacci

斐波那契数列是这样的数列:

0、1、1、2、3、5, 8、13、21、34 ……

下一项是上两项的和。

2 是上两项的和(1+1) 3 是上两项的和(1+2)、 5 是(2+3)、 依此类推!

更多有意思的介绍可以见参考链接;

算法

1. 直接递归

初步想法就是采用递归的方式去实现 fib(n) = fib(n-1) + fib(n-2)

代码语言:javascript
复制
def fib(n):
 if n == 1:
  return 0
 if n == 2:
  return 1
 return fib(n-1) + fib(n-2)

n=6为例,可以看到fib(6)分解为fib(5)、fib(4)fib(5)分解为fib(4)、fib(3), fib(4)分解为fib(3)、fib(2), 等等

可以看到这个过程中会有重复计算的过程;相当于每个fib(k)都要被计算2次, n个数字,则需要计算2^n次,所以时间复杂度为O(2^n); 由于采用递归的方式,需要用栈保存每次递归的结果,然后一直到头后再反向得到结果,需要用O(n)的空间去存储fib(n)、fib(n-1)..., fib(1), 所以空间复杂度为O(n);


2. 递归+hashmap

那么借助于**空间换时间**的思想,使用hashmap去保存每次计算到的fib(k),需要用到fib(k)时候,直接去hashmap中查就行,不用重复计算;

代码语言:javascript
复制
def fib(n, memorize={1:0, 2: 1}):
 if n in memorize:
  return memorize[n]
 memorize[n] = fib(n-1, memorize) + fib(n-2, memorize)
 return memorize[n]

时间复杂度为O(n), 空间复杂度为O(n)


3. 递归+两变量

相较于上面的每个fib(i)都保存,可以只保留

从头开始算,可以只保留最近的两个元素的值就可以的

代码语言:javascript
复制
def fib(n):
 lastTwo = [0, 1]
 counter = 3
 while counter <= n:
  nexFib = lastTwo[0] + lastTwo[1]
  lastTwo[0] = lastTwo[1]
  lastTwo[1] = nexFib
  counter += 1
 return lastTwo[1] if n > 1 else lastTwo[0]

时间复杂度为O(n), 空间复杂度为O(1)

参考

  • https://www.shuxuele.com/numbers/fibonacci-sequence.html
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技时讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 斐波那契数列 Fibonacci
  • 算法
    • 1. 直接递归
      • 2. 递归+hashmap
        • 3. 递归+两变量
        • 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档