利用python【问题描述】 小朋友玩跳格子游戏,从起跳线开始有一列n个格子,小朋友一次可以跳1格或者2格。小朋友有多少种不同的方式从起跳线跳到第n个格子呢? 【输入形式】一行,格子数目n(1≤n≤46) 【输出形式】一行,方式数目 【样例输入1】2 【样例输出1】2 注:2种方式: 1格 1格 2格 【样例输入1】3 【样例输出1】3 注:3种方式 1格 1格 1格 2格 1格 1格 2格
时间: 2024-03-24 09:38:33 浏览: 151
好的,这是一个求斐波那契数列的问题,可以使用递归或动态规划的方法来解决。下面分别介绍这两种方法。
方法一:递归
斐波那契数列的递归式为:$f(n) = f(n-1) + f(n-2)$,其中 $f(1) = 1$,$f(2) = 2$,所以可以写出递归函数:
```python
def fibonacci(n):
if n == 1:
return 1
elif n == 2:
return 2
else:
return fibonacci(n-1) + fibonacci(n-2)
```
这个函数的含义是:当格子数为 $n$ 时,小朋友跳到第 $n$ 个格子的不同方式数量为 `fibonacci(n)`。
方法二:动态规划
动态规划的思路是将原问题分解为若干个子问题,并将每个子问题的解记录下来,避免重复计算。在这个问题中,可以定义一个数组 `dp`,其中 `dp[i]` 表示小朋友跳到第 $i$ 个格子的不同方式数量。显然,`dp[1]=1`,`dp[2]=2`。对于 $i\ge3$,有:
$$
dp[i] = dp[i-1] + dp[i-2]
$$
这个式子的意思是,小朋友要么从第 $i-1$ 个格子跳到第 $i$ 个格子,要么从第 $i-2$ 个格子跳到第 $i$ 个格子。因此,可以使用一个循环来计算 `dp` 数组的值:
```python
n = int(input())
dp = [0] * (n+1) # 初始化 dp 数组
dp[1] = 1 # 边界条件
dp[2] = 2 # 边界条件
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n]) # 输出跳到第 n 个格子的不同方式数量
```
这个程序的含义是:当格子数为 $n$ 时,小朋友跳到第 $n$ 个格子的不同方式数量为 `dp[n]`。
这两种方法的时间复杂度都是 $O(n)$,但是递归方法会重复计算很多子问题,因此效率相对较低。动态规划方法则可以避免重复计算,速度更快。
阅读全文