假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
第一次的代码:
使用最普通的递归:
minh=[1,2] #每次只能跳1,2,步
ans=[]
def plt(l1,h1,n,ans):
if h1==n: #记录成功
ans.append(1)
return
else:
for i in l1:
if h1 + i <=n:
plt(l1,h1+i,n,ans)
else:
break
plt(minh,0,n,ans)
return len(ans)
但是再第38个楼梯超时了
第二次的代码:
使用带备忘录的递归算法:
每个值只算一遍
beiwl=[0]*(n+1) #备忘录
def plt(n):
if beiwl[n]>0:#如果备忘录中有值,直接使用
return beiwl[n]
elif n<=2:
beiwl[n]=n #这里一开始我写成==,半天结果全是0,注意
return beiwl[n]
else:
beiwl[n]=plt(n-1)+plt(n-2) #备忘录里没值,则计算
return beiwl[n]
return plt(n)
24ms,排名98%