Fibonacci数列大数取模,用python实现(多种方法)

本文介绍了使用Python实现斐波那契数列大数取模的三种方法:循环法、递归法和矩阵法。循环法简单但效率较低,递归法可能导致递归深度限制,而矩阵法则利用快速幂优化,速度快。作者指出,尽管numpy矩阵乘法简便,但在处理大数时可能因数据类型限制导致溢出。文章提供了详细代码并探讨了不使用numpy的原因。
摘要由CSDN通过智能技术生成

在蓝桥杯官网做这道题,查阅网上大量代码后,竟没有一个用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<
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值