这篇文章参考了许多资料,其中来自博客的有 《斐波那契数列的5种python解法》1,原文作者 :AI算法工程师YC,在这里简单记录一下学习过程。
斐波纳契数列是python练习时经常遇见的一个很基础的问题,在网上也有许许多多的解法,在备战蓝桥杯的python个人赛,我也刚好遇见了有关斐波那契数列的问题,前前后后用了多种方法,才实现了通过系统100%的测试,达到时长和内存的要求。
目录
一、解题前提,要求和测试内容
编码环境和工具
环境为 python3.7.0,用的python3.7.0自带的IDLE,无扩展库。
它的问题和要求是这样子的
问题
Fibonacci数列 斐波纳契(一种整数数列)
资源限制
时间限制:1.0s 内存限制:256.0MB
python中的内置函数
问题描述
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
我们的测试输入数据分别是
1
2
10
55
100
500
999
9999
99999
999999
共十组输入数据
二、测试方法
(1)递归法
def fib_recur(n):
assert n >= 0, "n > 0"
if n == 1 or n == 2:
return 1
else:
return fib_recur( n - 1 ) % 10007 + fib_recur( n - 2 ) % 10007
n = eval(input())
print(fib_recur(n))
只能通过30%的测试,最大递归深度在比较中超过,产生递归错误。
(2)递推法
def Fibonacci(n):
a,b = 0,1
for i in range(n):
a, b = b, a + b
return a % 10007
n = eval(input())
print(Fibonacci(n))
在输入999999超时,不能满足比较大的项的斐波纳契数列,不过满足一般情况下,通了90%的测试。
(3)生成器
def Fibonacci(max):
a, b = 0, 1
while max > 0:
a, b = b