zoukankan      html  css  js  c++  java
  • 青蛙跳台阶问题

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

    问题:

    一只青蛙要跳上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
    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    作为一个新手程序员,该如何去挽救一个失败的项目?
    IOS查看APP的crash Log
    UITableView 性能优化(卡问题自检)
    ARC学习笔记(一)
    iPhone的UDID与push中使用的device token的关系
    跳转appstore的评分页面和软件的首页
    IOS项目Jenkins集成脚本举例
    jenkins集成学习心得
    学习设计模式心得
    网页跳转到APP
  • 原文地址:https://www.cnblogs.com/yunhgu/p/14458649.html
Copyright © 2011-2022 走看看