Python中的斐波纳契数列求余数的8种解法和一种有限条件下的最优解

    这篇文章参考了许多资料,其中来自博客的有 《斐波那契数列的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
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值