猴子爬山一只顽猴在一座有50级台阶的小山上爬山跳跃。上山时需从山脚至山顶往上跳50级台阶,一步可跳1级,或跳2级,或跳3级,求上山有多少种不同的跳法? (请用递归和递推方法分别实现,并比较两者的运行效率)写代码
时间: 2024-09-16 15:05:54 浏览: 95
猴子爬山问题 C语言求解
5星 · 资源好评率100%
这是一个经典的动态规划问题,通常称为“猴子爬楼梯”或“汉诺塔问题”的变体。我们可以使用递归和迭代(即递推)两种方法来解决这个问题。
**递归方法:**
递归的基本思路是从最后一级开始向上倒推,每一级都有三种选择:跳一级、跳两级或者跳三级。当到达第n级时,会有之前n-1级的所有可能性。
```python
def recursive_jumps(n):
if n <= 1: # 基本情况:如果只剩1级或0级,只有一种方法(直接跳上去)
return 1
else:
return recursive_jumps(n - 1) + recursive_jumps(n - 2) + recursive_jumps(n - 3)
```
递归方法虽然直观,但由于重复计算较多,时间复杂度较高,大约是O(7^n),其中7是所有可行跳跃的最大步数。
**递推方法(动态规划):**
递推方法通过创建一个数组存储已经计算过的结果,避免了重复计算,提高了效率。
```python
def dynamic_jumps(n, dp = [0] * (n+1)):
for i in range(1, n+1):
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
return dp[n]
```
递推方法的时间复杂度是线性的,大约为O(n),因为只遍历了一次数组。
阅读全文