Fibonacci数列的四种解法

本文探讨了如何高效地计算Fibonacci数列中Fn除以10007的余数,避开递归带来的超时问题,通过列表和变量优化解法,提供四种实现方法,包括解法3和本人最优解法,以及它们的时间复杂性和内存使用情况。
摘要由CSDN通过智能技术生成
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
问题:

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式:

输入包含一个整数n。

输出格式:

输出一行,包含一个整数,表示Fn除以10007的余数。

解法1 (递归) 不推荐使用

解法1 使用递归的思想,,当n较大时,会出现运行超时的问题,并且不太好理解

def tk(n):
    if n==1 or n==2:
        return 1
    else:
        return tk(n-1)+tk(n-2)

n=int(input())
a=tk(n)
a=a%10007
print(a)
解法2 (使用列表)

解法2 使用列表存储数,使用使用循环,将数添加到列表中,然后供下次计算。在最后只需要将列表最后一个数打印就好,

def tk2(n):
    list=[1,1]
    for i in range(n-2):
        list.append(list[-1]+list[-2])
    return list[n-1]

n=int(input())
a=tk2(n)
a=a%10007
print(a)
解法3(解法2的优化)

解法2使用了列表存储每一次计算出的Fibonacci数列数,,如果当n较大的情况下,会出现导致列表存不下这么多,当然现实中是没问题的,,但是在题目中规定了内存占用大小。所以解法3会对其进行优化,采用3个变量来存储

def tk2(n):
    a=1
    b=1
    c=0
    if n==1 or n==2:
        return 1
    else:
        for i in range(n-2):
            c=a+b
            a,b=b,c

    return c

n=int(input())
a=tk2(n)%10007

print(a)
解法4 (本人最优)

解法3解决了内存超限的问题,但是还有一点点小问题,我们条件中要求 时间限制1.0s ,而我在测试解法3时,运行时长是1.062ms,所以还是不符合要求,从而催动了解法4的诞生。


n=eval(input())
a=1
b=1
c=0
if n==1 or n==2:
    print(1)
else:
    for i in range(2,n):
        c=(a+b)%10007
        a,b=b,c
    
    print(c)

解法4是本人写的最优秀的解法。。内存占用 8.681mb 运行时长 218ms

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值