在蓝桥杯官网做这道题,查阅网上大量代码后,竟没有一个用Python实现的??(不得不说,python在算法比赛中依然很不受欢迎)
于是在这里分享一下自己的实现办法
先看一下题目要求
那其实主要问题就是如何实现斐波那契数列
1. 循环法:
这种办法速度很慢,但是代码很简单
因为python是可以很方便实现并行赋值的
这里在循环中不断的更新列表,使得列表中储存 Fn 和 Fn-1
def Fibonacci():
f1 = 1
f2 = 1
fibonacci = [f2, f1]
n = int(input("输入n:"))
if n == 1 or n == 2:
return 1
else:
for i in range(n - 2):
fibonacci[0], fibonacci[1] = fibonacci[0] + fibonacci[1], fibonacci[0]
return fibonacci[0] % 10007
2.递归法:
这个方法也比较慢啊,把这个递归展开,是一个巨大的二叉树,重复子过程太多
而且。。。你可能会遇到这样的错误
RecursionError: maximum recursion depth exceeded in comparison
没错递归超过默认深度,我们知道无限递归会耗尽所有的资源,所以python很良心的为我们设置了最大深度为1000
你可以自行修改
import sys
sys.setrecursionlimit(100000) #例如这里设置为十万
n = int(input("输入n:"))
def Fibonacci(_n):
if _n == 1 or _n == 2:
return 1
else:
return Fibonacci(_n - 1) + Fibonacci(_n - 2)
3.矩阵法:
终极大法,速度非常快
斐波那契数列是可以用矩阵来推导的,过程如下,有大一数学基础就可以看懂
因为矩阵是符合结合律的,所以我们只需要重复上述过程,即
但是算n次方依然很慢,那么我们只需要用一下快速幂,数万次的运算就能减少到几十次。快速幂的原理如下
所以每次计算之前,我们只需要判断一下n是奇数还是偶数,如果是偶数我们直接按上述运算即可。若果是奇数,我们不妨先和斐波那契矩阵先乘一次,这样就变成了偶次方运算。
因为python本身不带矩阵,所以我用二维列表模拟矩阵,自己写的矩阵乘法
(有些人可能会问我为什么不用numpy,矩阵乘法就是一行函数的事。。
下面我会解释)
先上代码
f1 = 1<