第十一章 24题
一只青蛙要跳上 n 层高的台阶,一次能跳一级,也可以跳两级,请问这只青蛙有多少种跳上这个 n层高台阶的方法?
思路分析:这个问题有三种方法来解决,并在下面给出三处方法的 python 实现。
方法1:递归
设青蛙跳上 n 级台阶有 f(n)种方法,把这 n 种方法分为两大类,第一种最后一次跳了一级台阶,这类方法共有 f(n-1)种,第二种最后一次跳了两级台阶,这种方法共有 f(n-2)种,则得出递推公式f(n)=f(n-1)+f(n-2),显然,f(1)=1,f(2)=2,递推公式如下:
- 这种方法虽然代码简单,但效率低,会超出时间上限*
// An highlighted block
def memo(f):
cache = {}
def helper(x):
if x in cache:
return cache[x]
cache[x] = f(x)
return cache[x]
return helper
@memo
def jumpFloor(n):
# write code here
if n == 1:
return 1
elif n == 2:
return 2
else:
return jumpFloor(n - 1) + jumpFloor(n - 2)
if __name__ == "__main__":
print(jumpFloor(99))
方法 2: 用循环来代替递归
这种方法的原理仍然基于上面的公式,但是用循环代替了递归,比上面的代码效率上有较大的提升
代码实现如下:
// An highlighted block
class Solution:
def climbStairs(self,n):
if n==1 or n==2:
return n
a=1;b=2;c=3
for i in range(3,n+1):
c=a+b; a=b; b=c
return c
if __name__ == '__main__':
a= Solution()
print(a.climbStairs(7))
方法3:建立简单数学模型,利用组合数公式
设青蛙跳上这 n 级台阶一共跳了 z 次,其中有 x 次是一次跳了两级,y 次是一次跳了一级,则有z=x+y ,2x+y=n,对一个固定的 x,利用组合可求出跳上这 n 级台阶的方法共有种方法又因为 x 在区
间[0,n/2]内,所以我们只需要遍历这个区间内所有的整数,求出每个 x 对应的组合数累加到最后的结果即可。
// An highlighted block
var foo = 'bar';