青蛙跳台阶问题

------------恢复内容开始------------

问题:

一只青蛙要跳上n层高的台阶,一次能跳一层,也可以调两层,问这只青蛙有多少种跳上这个台阶的方法?

思路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。

这个方法代码简单,但是效率很低。

代码实现:

def climbStairs1(n:int)->int:
    if n==1 or n==2:
        return n
    else:
        return climbStairs1(n-1)+climbStairs1(n-2)

思路2:

用循环来代替递归

def climbStairs2(n:int)->int:
    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

思路3:

建立数学模型,利用组合数公式

设青蛙跳上n层台阶一共跳了z次,其中x次是一次跳了一层,y次是一次跳了两层,则有z=x+y , 2x+y=n,对于固定的x,利用组合可求出跳上n级台阶的方法共有

多少种方法,因为x 取值范围为[0,n/2],因此只需要遍历这个区间的所有整数,求出每个x对应的组合数累加到最后的结果就可以了。

 

def climbStairs3(n:int)->int:
    def fact(n):
        result=1
        for i in range(1,n+1):
            result*=i
        return result
    
    total=0
    for x in range(n//2+1):
        total+=fact(x+n-2*x)/fact(x)/fact(n-2*x)
    return total

 

posted @ 2021-02-28 12:26  不能说的秘密  阅读(281)  评论(0编辑  收藏  举报