概述
输入n,求斐波那契数列的第n项。
答案取模1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
首先试了一下最常规的递归方法,很快写好但是对于稍大一点的数字,大量的重复计算使得运行时间就很长。
然后就用了非递归,从小往大计算,用python自带的队列deque保存中间结果,记得在保存的时候就直接取模。
from queue import deque
def fib2(n: int) -> int: #非递归
q = deque()
if n == 0:
return 0
if n == 1:
return 1
q.append(0)
q.append(1)
i = 2
while i <= n :
q.append((q.popleft()+q[0])%1000000007)
i += 1
return q.pop()
运行效率:
最后又试了一下递归的备忘录解法:
def fib(self, n: int) -> int:
l = [-1] * 100 # 建立数组记录中间结果,遇到一个数字判断数组里是否有结果,没有再计算
def f(n):
if n == 0:
return 0
if n == 1:
return 1
if l[n-2] == -1:
l[n-2] = f(n-2)
if l[n-1] == -1 :
l[n-1] = f(n-1)
return (l[n-2]+l[n-1])%1000000007
return f(n)
总结:还是使用非递归,保留两个中间结果,效率比较高。
接下来做了斐波那契数列的应用——青蛙????跳台阶问题:
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案同样需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
首先自己计算了一下,发现规则:
n 0 1 2 3 4 5...
跳法 1 1 2 3 5 8...
class Solution:
def numWays(self, n: int) -> int:
if n == 0:
return 1
if n == 1:
return 1
a = 1 #n=0时,结果为1
b = 1
i = 2
while i <= n:
a = (a+b)%1000000007
a,b = b,a
i += 1
return b
最后
以上就是怡然萝莉为你收集整理的剑指offer10:斐波那契数列及青蛙跳台阶问题(python)的全部内容,希望文章能够帮你解决剑指offer10:斐波那契数列及青蛙跳台阶问题(python)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复