C++ 遞歸、搜索與回溯:三劍客
更新時間:2026年04月10日 08:52:32 作者:JAVA+C語言
本文介紹了C++遞歸、搜索、回溯三大核心內(nèi)容,下面用最清晰、最容易理解的方式,一次性講透 C++ 遞歸、搜索、回溯三大核心內(nèi)容,適合學(xué)習(xí)、復(fù)習(xí)、寫題,感興趣的朋友跟隨小編一起看看吧
下面用最清晰、最容易理解的方式,一次性講透 C++ 遞歸、搜索、回溯三大核心內(nèi)容,適合學(xué)習(xí)、復(fù)習(xí)、寫題。
一、遞歸(Recursion)
1. 概念
函數(shù)自己調(diào)用自己,把大問題拆成更小的同類型問題。
2. 兩個必備條件
- 遞歸出口(base case):不再遞歸,直接返回結(jié)果
- 遞歸式:把問題規(guī)??s小
3. 經(jīng)典示例:求階乘
int fact(int n) {
if (n == 0) return 1; // 出口
return n * fact(n - 1); // 遞歸式
}4. 本質(zhì)
- 系統(tǒng)使用棧保存每一層調(diào)用
- 太深會棧溢出(stack overflow)
二、搜索(Search)
搜索就是在所有可能情況里找答案。常見兩類:
- 深度優(yōu)先搜索 DFS(一條路走到底)
- 廣度優(yōu)先搜索 BFS(一層層擴散)
遞歸最常配合 DFS。
三、回溯(Backtracking)
1. 概念
遞歸搜索 + 撤銷選擇 = 回溯
- 選一條路走
- 走不通就回退一步
- 嘗試其他可能
典型場景:排列、組合、子集、N 皇后、數(shù)獨
2. 回溯通用模板(必背)
void backtrack(路徑, 選擇列表) {
if (滿足結(jié)束條件) {
記錄答案;
return;
}
for (選擇 : 選擇列表) {
做選擇;
backtrack(路徑, 選擇列表);
撤銷選擇; // 回溯核心
}
}四、三個經(jīng)典例子(一看就懂)
例 1:全排列(回溯經(jīng)典)
求 [1,2,3] 的所有排列
vector<vector<int>> res;
vector<int> path;
bool vis[10];
void dfs(vector<int>& nums) {
if (path.size() == nums.size()) {
res.push_back(path);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (vis[i]) continue;
vis[i] = 1;
path.push_back(nums[i]);
dfs(nums);
path.pop_back(); // 回溯
vis[i] = 0;
}
}例 2:子集(搜索所有可能)
void dfs(vector<int>& nums, int u) {
res.push_back(path);
for (int i = u; i < nums.size(); i++) {
path.push_back(nums[i]);
dfs(nums, i + 1);
path.pop_back();
}
}例 3:斐波那契(純遞歸)
int fib(int n) {
if (n <= 1) return n;
return fib(n-1) + fib(n-2);
}五、三者關(guān)系(一句話總結(jié))
- 遞歸:函數(shù)自己調(diào)用自己,是實現(xiàn)方式
- 搜索:遍歷所有可能,是算法思想
- 回溯:遞歸搜索 + 撤銷選擇,是搜索的一種通用寫法
六、最??碱}型
- 全排列、組合、子集
- N 皇后
- 數(shù)獨
- 電話號碼字母組合
- 矩陣中的路徑(單詞搜索)
- 分割回文串
到此這篇關(guān)于C++ 遞歸、搜索與回溯的文章就介紹到這了,更多相關(guān)C++ 搜索與回溯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

