递推与递归
一、递推
-
1.递推:从已知道的若干项出发,利用递推关系依次推算出后面的未知项的方法,我们称为递推算法。
-
2.递推实现:通过循环和数组的形式推出答案。
-
eg:阶乘计算:
a[1] = 1;//初始值 for (int i = 2; i <= n; i++) { a[i] = a[i - 1] * i;//递推求解 }
-
斐波拉契数列:
a[1] = a[2] = 1;//忘了就全错的初始值 for (int i = 3; i <= n; i++) { a[i] = a[i - 1] + a[i - 2];//还是递推求解 }
铺砖
题目描述
有2×n的一个长方形方格道路,只有一种1×2的砖去铺,总共有多少种铺法呢?
输入格式
一行,一个n(0≤n≤45)
输出格式
一行,一个数(总共有多少种铺法)
样例输入
3
样例输出
3
数据范围与提示
必须用递推,若没有道路,铺法可视为1种
解析
考虑递推,通过画图可得出递推式:a_i = a_{i + 1} + a_{i + 2}ai=ai+1+ai+2
因为题目要求没有道路,铺法可视为1种,所以第0项为1。
参考代码
#include <bits/stdc++.h>
using namespace std;
int a[55];
int main() {
int n;
cin >> n;
a[0] = 1;
a[1] = 1;
for (int i = 2; i <= n; i++) {
a[i] = a[i - 1] + a[i - 2];
}
cout << a[n];
return 0;
}
好了,说了这么“多”,先总结一下
递推步骤:
-
①读题,抓住关键词
-
②找出递推式(最难也最重要的步骤)
-
③寻找初始值(也很重要,千万不能忘)
-
④写程序,调试
二、递归
1.递归:从已知问题的结果出发,用迭代表达式逐步推算出问题的开始的条件,即顺推法的逆过程,称为递归。简单来说,就是把一(多)个函数进行自调用的过程
2.递归实现:用函数的形式进行运算。
3.递推与递归的不同点:递归是从未知到已知逐步接近解决问题的过程,而递推从已知到未知。
-
举个例子,我们听过的“从前有座山,山里有座庙……”可以用递归的形式来实现。
void f() {
if (他们都累了||小和尚不想听故事了) {
cout << "故事讲完了。";
return;
}
cout << "从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事:";
f();
}
-
一般的框架:
返回类型 f(自定义参数) {
if (满足条件、到达出口) {
更新/输出解;
return;
}
维护自定义变量;
f(自定义参数);
}
最大公约数
题目描述
用递归算法求两个数m和n的最大公约数。(m>0,n>0)
输入格式
两个数,即m和n的值。
输出格式
最大公约数。
样例输入
8 6
样例输出
gcd=2
解析
- 最简单的方法是枚举两个数的约数,找出最大的公约数,但是可能会超时。
- 考虑递归,需要借助辗转相除法。
参考代码
#include <bits/stdc++.h>
using namespace std;
int gcd(int x, int y) {
if (y == 0) return x;
return gcd(y, x % y);
}
int main() {
int n, m;
cin >> n >> m;
cout << "gcd=" << gcd(n, m);
return 0;
}
啦啦啦啦啦啦啦啦啦啦啦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~