python实现连续数列相加_技术 | Python经典面试题解析实现斐波那契数列

8daee5ed0b060717abb70151fad0f096.png

黑马程序员

微信号:heiniu526

传智播客旗下互联网资讯,学习资源免费分享平台

大家在面试过程中经常会考到斐波那契数列,斐波那契数列(Fibonacci)最早由印度数学家Gopala提出,而第一个真正研究斐波那契数列的是意大利数学家 Leonardo Fibonacci,斐波那契数列的定义很简单,用数学函数可表示为:

236dfb29026968e8638ec4006a7b84c8.png

数列从0和1开始,之后的数由前两个数相加而得出,例如斐波那契数列的前10个数是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34。

用 Python 实现斐波那契数列常见的写法有三种,各算法的执行效率也有很大差别,在面试中也会偶尔会被问到,通常面试的时候不是让你简单的用递归写写就完了,还会问你时间复杂度怎样,空间复杂度怎样,有没有可改进的地方。

1fcf05d2b62ba9d11a9aa2745bdf85bd.gif 递归法

所谓递归就是指函数的定义中使用了函数自身的方法。

6cfcbddfaaf197ec865b971dc3f2b918.png

递归是一种代码最简洁的方法,但它是效率非常低,因为会出现大量的重复计算,时间复杂度是:O(1.618 ^ n),1.618是黄金分割。同时受限于 Python 中递归的最大深度是1000,所以用递归来求解并不是一种可取的办法。

1fcf05d2b62ba9d11a9aa2745bdf85bd.gif 递推法

递推法就是从0和1开始,前两项相加逐个求出第3、第4个数,直到求出第n个数的值。

e0d632bdad398a9e9e5debe0892cf047.png

这种算法的时间复杂是O(n),呈线性增长,如果数据量巨大,速度越到后面会越慢。上面两种方式都是使用分而治之的思想,就是把一个大的问题化小,然后利用小问题的求解得到目标问题的答案。

1fcf05d2b62ba9d11a9aa2745bdf85bd.gif 矩阵法

线性代数》是大学计算机专业低年级的课程,这门课教的就是矩阵,那时候觉得这东西学起来很枯燥,没什么用处,工作后你才发现搞机器学习、数据分析、数据建模时大有用处,书到用时方恨少。其实矩阵的本质就是线性方程式。

斐波那契数列中两个相邻的项分别为:F(n) 和 F(n - 1),如果把这两个数当作一个2行1列的矩阵可表示为:

72a2e56992db5a5db3f3b4a5562787ab.png

因为 F(n) = F(n-1)+F(n-2),所以就有:

0bc714982d77d9509b62ded592b6e1f3.png

通过反推,其实它是两个矩阵的乘积得来的:

a767c1d7b6c1f7112618bb370772caae.png

依此类推:

e18c635a24ed29ae89439b939db09fc1.png

最后可推出:

18a2b27ba6e354563f138cef889d25f6.png

因此想要求出F(n)的值,只要能求出右边矩阵的n-1次方的值,最后求得两矩阵乘积,取新矩阵的第一行的第一列的值即可,比如n=3时:

8b5aecf61f09d2a52965869443e958cc.png

可以得知F(3)的值2,F(2)的值为1,因为幂运算可以使用二分加速,所以矩阵法的时间复杂度为 O(log n)。

我们可以用科学计算包 numpy 来实现矩阵法:

6c35861e65ebcd277751c3063e7b2f2c.png

1fcf05d2b62ba9d11a9aa2745bdf85bd.gif 总结

3种不同的算法效率对比:

1103e5fca8860f6508b5147a1d705b2e.png

从上面图可以看出递归法效率惊人的低,矩阵法在数据量比较大的时候才突显出它的优势,递推法随着数据的变大,所花的时间也越来越大。

6aa543f46baeddf0286c6d908c832bcb.gif 干货不错就点下在看 f43aa1c4c7eb1193e56fbc2bc007d86d.gif

▼点击 加程序员交流群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值