青蛙跳台阶问题
------------恢复内容开始------------
问题:
一只青蛙要跳上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
不论你在什么时候开始,重要的是开始之后就不要停止。
不论你在什么时候结束,重要的是结束之后就不要悔恨。