【AI达人养成营】作业1的斐波那契数列思考
收藏
对于作业1中的斐波那契数列的题目
我的思路是用公式算,即找到斐波那契数列的通项公式,把n代入公式,获得一个数,把这个数再对10007取余数,获得最终答案。
n = int(input())
a=5**(1/2)
result=1.0/a*(((1+a)/2)**n-((1-a)/2)**n)
result=int(result)
result=result%10007
print(result)
提交完作业后,我又有了一个疑问,公式中存在根号五,会不会影响精度之类的,所以我想试试其他方案。
利用递推公式,一步一步算出第n项,并相加,边加边与对10007取余数,最后f[n]就是答案。
n=int(input())
f=[0,1,1]
for i in range(3,n+1,1):
f.append((f[i-1]+f[i-2])%10007)
print(f[n])
发现,f中的好多元素使用过几次就不再使用了,一直存着浪费空间,我想了一种方案,优化了一下,使每个元素被用两次就删除。
n=int(input())
f=[1,1]
for i in range(3,n+1,1):
f[(i+1)%2]=(f[0]+f[1])%10007
print(f[(n+1)%2])
这样,从始至终列表f里都只有2个元素,对于较大的n,所占用内存应该会少很多吧。
如果有错误,还请大家指出。
0
收藏
请登录后评论