- C++
C++ 简单递推算法教程(0基础入门)
- 2025-8-30 11:56:03 @
C++ 简单递推算法教程(0基础入门)
递推算法是一种通过已知的初始条件,利用特定的关系逐步推导出后续结果的算法。它的核心思想是"从已知推向未知",非常适合解决有明显规律的问题。
什么是递推?
想象一下爬楼梯:如果你知道爬上第1级和第2级楼梯的方法,那么爬上第3级楼梯的方法就是爬上第1级后再爬2级,加上爬上第2级后再爬1级。这种从已知结果推出新结果的方式就是递推。
递推算法是编程中一种非常重要的思想,它通过已知的初始条件,利用特定的递推关系求出中间结果,进而得到最终答案。这种方法特别适合解决有明确规律的问题,代码简洁且效率高。
什么是递推算法?
递推算法的核心思想是:从已知条件出发,逐步推导出未知结果。它通常需要:
确定初始条件(基础情况)
找到递推关系式(如何从前面的结果推出后面的结果)
按照递推关系计算出最终答案
递推算法的优势
实现简单,代码可读性高
时间和空间效率通常较好
适合解决数列、组合计数、动态规划等多种问题
递推算法的基本步骤:
- 确定初始条件(已知的起始值)
- 找到递推关系(从已知值推出新值的公式)
- 根据递推关系计算后续结果
示例1:计算斐波那契数列
斐波那契数列是典型的递推问题,数列规则如下:
- 第1项和第2项都是1
- 从第3项开始,每一项等于前两项之和
下面是实现代码:
#include <iostream>
using namespace std;
int main() {
// 定义变量
int n; // 要计算的斐波那契数列的项数
long long f[100]; // 用于存储斐波那契数列的数组,使用long long防止溢出
// 输入要计算的项数
cout << "请输入要计算的斐波那契数列的项数: ";
cin >> n;
// 1. 确定初始条件
f[1] = 1; // 第1项为1
f[2] = 1; // 第2项为1
// 2. 利用递推关系计算后续项
// 递推关系:f[i] = f[i-1] + f[i-2]
for (int i = 3; i <= n; i++) {
f[i] = f[i-1] + f[i-2];
}
// 3. 输出结果
cout << "斐波那契数列的前" << n << "项是: " << endl;
for (int i = 1; i <= n; i++) {
cout << f[i] << " ";
}
cout << endl;
return 0;
}
代码解析:
- 首先定义了变量和数组,数组用于存储计算结果
- 设置初始条件:第1项和第2项都是1
- 使用for循环和递推公式f[i] = f[i-1] + f[i-2]计算后续各项
- 最后输出计算结果
示例2:计算阶乘
阶乘的递推关系也很简单:
- 0的阶乘是1(初始条件)
- n的阶乘 = n × (n-1)的阶乘(递推关系)
递推算法的优点:
- 实现简单,容易理解
- 效率高,时间复杂度通常为O(n)
- 相比递归,不会出现栈溢出问题
练习:
尝试使用递推算法解决以下问题:
- 有n级台阶,每次可以走1级或2级,求有多少种不同的走法
- 计算1+2+3+...+n的和
提示:第一个问题的递推关系是f(n) = f(n-1) + f(n-2),初始条件f(1)=1, f(2)=2。
通过这些例子,你应该对递推算法有了基本的了解。递推算法在解决数学问题、动态规划等领域有广泛应用,掌握它对于编程入门非常重要。
2 条评论
-
admin SU @ 2025-8-30 12:32:29
#include<iostream> using namespace std; int main() { //接受n,计算出n! //20! 尝试计算时会溢出,无法用 long long 正确表示(实际值约为 2.4×10¹⁸,超过了 long long 的最大值) //21! 尝试计算时会溢出,无法用unsigned long long正确表示(实际值约为 5.1×10¹⁹,超过了其最大值) int n; cin >> n; unsigned long long f[200]; //1、确定初始条件(已知的起始值) f[0] = 1;//0! //2、找到递推关系(从已知值推出新值的公式) //f[i] = i*f[i-1] //3、根据递推关系计算后续结果 for (int i = 1; i <= n; i++) { f[i] = i*f[i - 1]; } cout << f[n] << endl; return 0; }
-
2025-8-30 12:32:21@
#include<iostream> using namespace std; int main() { unsigned long long fib[200];//unsigned 无符号数 没有负数 //第93项会超过long long //第94项会超过unsigned long long //1、从已知条件出发,逐步推导出未知结果。 //递推算法的边界条件 fib[1] = 1; fib[2] = 1; //2、找到递推关系式(如何从前面的结果推出后面的结果) //fib[i] = fib[i-1] + fib[i-2] //3、按照递推关系计算出最终答案 for (int i = 3; i <= 100; i++) { fib[i] = fib[i - 1] + fib[i - 2]; } //4、接受一个n,输出第n项 int n; cin >> n; cout << fib[n] << endl; return 0; }
- 1