算法笔记:递推
递推最通俗的理解就是数列,递推和数列的关系就好比算法和数据结构的关系,数列有点
像数据结构中的线性表(可以是顺序表,也可以是链表,一般情况下是顺序表),而递推就是一
个循环或者迭代的枚举过程。
递推本质上是数学问题。
一、斐波那契数列
斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0 , F(1)=1
F(n) =F(n - 1)+F(n- 2),其中n>1,给定n(0 ≤n≤30),请计算F(n)。
拿到这个题目,我们首先来看题目范围,最多不超过30,那是因为斐波那契数的增长速度很快,是指数级别的。所以如果n很大,就会超过c语言 中32位整型的范围。这是一个最基础的递推题,递推公式都已经告诉你了,我们要做的就是利用一个循环来实现这个递推。
我们只需要用一个F[31]数组,初始化好F[0]和F[1],然后按照给定的公式循环计算就可以了。写成伪代码像这样:
int fib(int n) {
int i;// (1)
int F[31] ={0, 1};// (2)
for(i = 2; i <= n; ++i) { // (3)
F[i] = F[i-1] + F[i-2]; // (4)
return F[n];// (5)
(1)首先定义一个循环变量;
(2) 再定义一个数组记录斐波那契数列的第n项,并且初始化第0项和第1项。
(3)然后一个for 循环,从第2项开始;
(4)利用递推公式逐步计算每一项的值;
(5)最后返回第n项即可。
二、斐波那契数列变形
给定一个n(1 ≤n≤ 45)代表总共有n阶楼梯,一开始在第0阶,每次可以爬1或者2个台阶,问总共有多少种不同的方法可以爬到楼顶。
我们定义一个数组f[46],其中fi]表示从第0阶爬到第i阶的方案数。由于每次可以爬1或者2个台阶,所以对于第i阶楼梯来说,所以要么是从第i-1阶爬过来的,要么是从i-2阶爬过来的,于是得出一个递推公式:f[i] = f[i-1] + f[i-2]。
我们发现这个就是斐波那契数列,你可以叫它递推公式,也可以叫它状态转移方程。这里的fi就是状态的概念,从一个状态到另一个状态就叫状态转移。
当然我们还要考虑初始状态,f[0]代表从第0阶到第0阶的方案数,当然就是1啦,f[1]代表从第0阶到第1阶的方案数,由于只能走1阶,所以方案数也是1。
代码就不再累述了。
总结:1.从最初开始推导
2.定义一个数组,保存每一步得到的结果
3.推导出:当前要计算的结果,和上一个结果(或者前几个结果)的关系。
具体步骤:
1.定义数组f
2.定义f[1]...;
3.for循环从前面定义的下一个开始,到我们要推导的结果数。
4.找出f[i]和前一个(f[i-1],甚至更多)的关系(递推公式)
5.循环结束,输出结果数组的所求值(比如f[n]);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具