【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
收藏
请登录后评论