递推算法编程练习

一、关于递推算法

  递推关系是一种简洁的常见数学模型,在这种类型的问题中,每个数据都和前面的若干个数据项(或后面的若干个数据项)有一定的关联,这种关联一般通过“递推关系式”表示,而关键就是要找到这个递推关系式。问题求解一般从初始的一个或若干个数据项出发,通过递推关系逐步推进,从而得到最终结果,这种求解问题的方法叫“递推法”。其中,初始的若干数据项称为“边界”。
  递推算法通常用于解决那些可以分解为相似子问题的问题。递推算法的核心思想是利用已经计算出的结果来推导新的结果,从而避免重复计算,提高效率。

1、递推算法可以分为顺推和逆推两种:

(1)顺推法:从已知条件出发,逐步推算出要解决的问题的方法。它通常用于求解序列的下一项或达到某个特定状态所需的步骤。例如,斐波那契数列的求解就可以使用顺推法。
(2)逆推法:从已知问题的结果出发,用迭代表达式逐步推算出问题的初始条件。它是顺推法的逆过程,通常用于求解逆向问题或回溯问题。

2、递推算法的应用

(1)数列求解:递推算法在求解数列问题中具有重要作用。例如,斐波那契数列、等差数列、等比数列等都可以通过递推算法来求解。
(2)动态规划:动态规划是一种解决最优化问题的算法思想,它通常使用递推关系来求解最优解。递推算法在动态规划中具有广泛的应用。
(3)组合数学:递推算法在组合数学中也有重要作用。例如,求解排列、组合、概率等问题时,经常需要使用递推关系来简化计算。

3、递推算法的设计步骤

(1)确定数据项:根据题目要求,确定需要求解的数据项。
(2)找到递推关系式:通过分析题目,找到数据项之间的递推关系式。
(3)设计递推程序:根据递推关系式,设计递推程序来求解问题。找到递推的终点:确定递推过程的终点,即何时停止递推。
(4)输出结果:按要求输出求解结果。

二、练习

1、猴子吃桃子

题目描述:猴子吃桃子问题:猴子第一天摘下若干个桃子,当即吃了一半还不过瘾,又多吃了一个;第二天又将剩下的桃子吃掉一半又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个。到了第十天想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子?
输入:无
输出:一个整数,第一天共有多少个桃子

2、统计每个月兔子的总数

题目描述:有一对兔子,从出生后第3个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月(n<=50)的兔子总数为多少对?
输入1个整数n,表示第几个月.输出第n个月兔子的总数量有多少对.
样例
输入:9
输出:34

3、

d1

4、Pell数列

题目描述:有一种数列,它的前10项的值分别为:1 2 5 12 29 70 169 408 985 2378,这个数列被称为Pell数列,请问该数列的第n项的值是多少?(n<=1000)(a[1]=1,a[2]=2,a[i]=a[i-1]*2+a[i-2])
输入一个整数n,输出第n项的值。
样例
输入:10
输出:2378

5、上台阶

描述:楼梯有n(30 > n > 0)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶,编程计算共有多少种不同的走法。
输入
输入的每一行包括一组测试数据,即为台阶数n。最后一行为0,表示测试结束。
输出
每一行输出对应一行输入的结果,即为走法的数目。
样例输入
1
2
3
4
0
样例输出
1
2
4
7

6、

d2

7、

d3

8、

dt1

9、

dt2

10、

dt3

11、菲波那契数列(2)

描述:菲波那契数列是指这样的数列————数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。 给出一个正整数a,要求菲波那契数列中第a个数对1000取
模的结果是多少。
输入第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181
1

11、母牛的故事

题目:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式:输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。n=0表示输入数据的结束,不做处理。
输出格式:对于每个测试实例,输出在第n年的时候母牛的数量。每个输出占一行。
样例输入
2
4
5
0
样例输出
2
4
6

12、插方块的故事

题目描述:在2×n的长方形方格中,用n个1×2的骨牌插满方格,输入n ,输出插放方案的总数。 例如 n=3时,为2×3方格,骨牌的插放方案有三种方法,如下图所示:
c1
只能有两种插入方式一种是竖着插,一种是横着插,而且我们插一插就不难发现:当n=1时,只能是一种插法,即f(1)= 1,如下左图所示:当 n=2 时,只能是两种插法,即 f ( 2 ) = 2 ,如下图所示:
cf1
当n=3时可以第一列可以分为两种情况:
1.是横插如下图
cf3
2.是竖插如下图
cf4
  这样不难发现 f[3]=f[1]+f[2],而n个格子的时候同样的开始铺放时有两种铺放方法,一种是横插,一种是竖着插:
cf5
  所以此时如果横着着插就有剩下(n-1)个方块而这(n-1)个方块就有f(n-1)种插法,而如果是竖着插这(n-2)个剩余的方块就有f(n-2)中插法而f(n-1)和f(n-2)同样的可以这样逆推下去最后返回到了一个我们知道的最初的式子f[3]=f[1]+f[2]。也就是说f(n)=f(n-1)+f(n-2)。

13、马拦过河卒

  棋盘上A点有一个过河卒,需要走到目标B点。象棋中卒行走的规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如下图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点(x,y)(如下图中的C点和P1,P2,……,P8,注:马走“日”字。)。卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0)、B点(n, m) (n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在从键盘输入n,m,要你计算出卒从A点能够到达B点的路径的条数。
house












阅读

1、https://blog.csdn.net/mmz1207/article/details/136420627
2、https://blog.csdn.net/m0_63830846/article/details/123697002

posted @ 2025-07-22 10:15  gdyyx  阅读(62)  评论(0)    收藏  举报