假设一段楼梯共 15 个台阶,小明一步最多能上 3 个台阶。编写程序计算小明上这段楼 梯一共有多少种方法。要求给出递推法和递归法两种代码。
时间: 2024-10-13 15:08:30 浏览: 53
c++)小明上楼梯题解
小明上楼梯的问题可以转化为经典的动态规划问题,通常称为“爬楼梯”或“阶跃数”问题。我们可以用两个变量来表示当前剩余的台阶数和已经走过的最大步数。以下是两种方法的代码:
**递推法 (Bottom-Up Approach - 动态规划)**
递推法则通过从最简单的情况开始逐步构建更复杂的结果。在这个例子中,我们从0个台阶到15个台阶依次计算所有可能性。
```python
def climb_stairs_recurrence(steps):
if steps <= 0: # 如果没有台阶,有1种方法
return 1
elif steps == 1: # 只有一个台阶,也只有一种方法
return 1
else:
# 分别考虑不跨步、跨1步和跨2步到达的情况
dp = [0] * (steps + 1)
dp[0], dp[1], dp[2] = 1, 1, 2 # 初始化前三个状态
for i in range(3, steps + 1):
dp[i] = dp[i - 3] # 加上跨2步的情况
return dp[steps]
# 测试
stairs = 15
print("上楼梯的方法总数:", climb_stairs_recurrence(stairs))
```
**递归法 (Top-Down Approach - 回溯法)**
递归法会直接尝试解决所有可能的情况,然后回溯过程来找到最终的答案。但是由于存在大量重复计算,对于大的台阶数可能会导致效率较低。
```python
def climb_stairs_recursion(steps):
def helper(current, remaining):
if current == steps or remaining == 0: # 达到目标或无台阶
return 1
return helper(current + 1, remaining) + \
helper(current + 2, remaining - 1) + \
helper(current + 3, remaining - 2)
return helper(0, steps)
# 测试
stairs = 15
print("上楼梯的方法总数 (递归):", climb_stairs_recursion(stairs))
```
阅读全文