题目:
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
方法一
咋一看,完全懵,仔细想想,可以先写几个,找一下规律
f
(
1
)
=
1
f(1)=1
f(1)=1
f
(
2
)
=
2
f(2) = 2
f(2)=2
f
(
3
)
=
1
+
2
+
1
=
f
(
1
)
+
f
(
2
)
+
1
f(3) = 1+2 +1= f(1) +f(2)+ 1
f(3)=1+2+1=f(1)+f(2)+1
.
.
.
...
...
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n) = f(n-1) +f(n-2 )+ ... + f(1) +f(0)
f(n)=f(n−1)+f(n−2)+...+f(1)+f(0)
由上面的分析,可以写出代码如下
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
A, B = 1, 2
if number == 1:
return A
else:
for i in range(number -2 ): #n>=3 ,n=2为空
B = A + B + 1
A = B - 1
return B
方法二
对方法一继续分析,可以发现
f
(
1
)
=
1
f(1)=1
f(1)=1
f
(
2
)
=
2
f(2) = 2
f(2)=2
f
(
3
)
=
1
+
2
+
1
=
f
(
1
)
+
f
(
2
)
+
1
f(3) = 1+2 +1= f(1) +f(2)+ 1
f(3)=1+2+1=f(1)+f(2)+1
.
.
.
...
...
f
(
n
−
1
)
=
f
(
n
−
2
)
+
f
(
n
−
3
)
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n-1) = f(n-2 )+ f(n-3)... + f(1) +f(0)
f(n−1)=f(n−2)+f(n−3)...+f(1)+f(0)
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n) = f(n-1) +f(n-2 )+ ... + f(1) +f(0)
f(n)=f(n−1)+f(n−2)+...+f(1)+f(0)
用
f
(
n
)
−
f
(
n
−
1
)
f(n)-f(n-1)
f(n)−f(n−1)可以得到
f
(
n
)
−
f
(
n
−
1
)
=
f
(
n
−
1
)
f(n)-f(n-1)=f(n-1)
f(n)−f(n−1)=f(n−1)
从而可得
f
(
n
)
=
2
f
(
n
−
1
)
f(n)=2f(n-1)
f(n)=2f(n−1)
由此,可以得到更简洁的代码
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
# num =1 , n=1
# num =2 ,n =2
# num =3 , n = 2*2 =4
# num =4, n = 2*4
#...
# num =n , n = 2*(n-1)
n = 1
for i in range(2,number+1):
n = 2*n
return n
方法三
对方法一继续分析,可以发现
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
+
.
.
.
+
f
(
1
)
+
f
(
0
)
f(n)=f(n-1)+f(n-2)+...+f(1)+f(0)
f(n)=f(n−1)+f(n−2)+...+f(1)+f(0)
f
(
1
)
=
f
(
0
)
=
1
f(1)=f(0)=1
f(1)=f(0)=1
f
(
n
)
=
2
n
−
1
f(n)=2^{n-1}
f(n)=2n−1
由此,可以得到更简洁的代码
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
# num =0 ,n =1
# num =1 ,n =1
# num >1 ,n =2**(n-1)
if number == 0:
return 1
elif number == 1:
return 1
else:
return 2**(number-1)