由爬楼梯问题与斐波那契数列的关联到一般化

问题:

10阶楼梯,每次只能走1-2步,不能后退,问有几种走法?

设F(n)表示n阶一共有多少走法,从简单的一步步看:

1
2
3
4
5
F(1) = 1
F(2) = 2
F(3) = 3
F(4) = 5
...

可以看到F(n) = F(n-2) + F(n-1)

推想到更一般化的问题:

n阶楼梯,每次只能走1-m步,不能后退,问有几种走法?

可以推测:
F(n) = F(n-1) + F(n-2) + ... + F(n-m)

代码实现:

1
2
3
4
5
6
7
8
9
def climb(m,n):
dp = [0]*(n+1)
dp[0] = 1
for i in range(1,n+1):
for j in range(1,m+1):
if i < j:break
else:
dp[i] += dp[i-j]
return dp[n]