青蛙跳台阶问题

题目:一只青蛙一次可以跳1级台阶,也可以跳2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。


本文提供三种解法:

1)递归求解:

青蛙每跳一次前,有这样三种情况:
(1)只剩1级或0级台阶了,只能跳一步或者无法再跳了,那么这条路也走到了终点,走法的种类数可以加1;
(2)可以走2级台阶;
(3)可以走1级台阶。
于是利用python实现递归方法求解:

def climbStairs(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    else:
        return climbStairs(n-1)+climbStairs(n-2)

if __name__=="__main__":
    a=climbStairs(5)
    print a

2)数学归纳法求解:

如果n=1,总步数f(n)=1;如果n=2,总步数f(n)=2。

另一方面,当n>=3,当前还剩的步数f(n),如果接下去跳一步,那么还剩下的步数是f(n-1);如果接下去跳两步,那么还剩下的步数是f(n-2),故:f(n)=f(n-1)+f(n-2)。

现设s3=f(n),s2=f(n-2),s1=f(n-1),从时间、空间复杂度来说,这也是最简单的一种方法。

利用python实现数学归纳法求解:

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

res=solution()
a=res.climbStairs(5)
print a   

3)概率论思路求解:

首先把问题抽象成简单的数学模型,设2步台阶跳了x次,1步台阶跳了y次,那么:

2x + y = n

于是,当 x = i ,可知 x >= 0 ,且 x < n/2 (向下取整),设某时刻的 x = i ,那么有 y = n – 2 * x ,于是,总共需要走 z = i + n – 2 * x 步。

这时,问题即转化为:

z步骤中,有x个两步,y个一步,相当于z个空当,由x、y去填充,那么不同填充方法的数目符合概率公式:

C(x,z) = z! / ((z-x)!x!)

即从排列z中取其中x个数的种类,x内部无序。

利用python实现概率论思路求解:

class solution(object):
    def climbStairs(self,n):
        def fact(n):
            result=1
            for i in range(1,n+1):
                result*=i
            return result
        total=0
        for i in range(n/2+1):
            total+=fact(i+n-2*i)/fact(i)*fact(n-2*i)
        return total

res=solution()
a=res.climbStairs(5)
print a

最后,三种方法得到的结果:

================= RESTART: I:\python_DataStructure\青蛙跳.py =================
14547
>>> 

注:

跳到第N级话,

可以先跳N-1级,再跳1级;

也可以先跳N-2级,再跳2级。

所以f(n)=f(n-1)+f(n-2),就是斐波那契数列。

既然都知道是斐波拉契数列了,那就给个通式吧:

F(N) = ((5+5^(1/2))/10)*(((1+5^(1/2))/2)^n) + ((5-5^(1/2))/10)*(((1-5^(1/2))/2)^n)

其中:N >= 1

时间复杂度O(1)。


你可能感兴趣的:(Data,Structure,&,Algorithm,python,算法,数据结构)