news 2026/8/22 5:43:07

C++ 递归、搜索与回溯:三剑客

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 递归、搜索与回溯:三剑客

一、递归(Recursion)

1. 概念

函数自己调用自己,把大问题拆成更小的同类型问题。

2. 两个必备条件

  1. 递归出口(base case):不再递归,直接返回结果
  2. 递归式:把问题规模缩小

3. 经典示例:求阶乘

1

2

3

4

intfact(intn) {

if(n == 0)return1;// 出口

returnn * fact(n - 1);// 递归式

}

4. 本质

  • 系统使用保存每一层调用
  • 太深会栈溢出(stack overflow)

二、搜索(Search)

搜索就是在所有可能情况里找答案。常见两类:

  1. 深度优先搜索 DFS(一条路走到底)
  2. 广度优先搜索 BFS(一层层扩散)

递归最常配合DFS

三、回溯(Backtracking)

1. 概念

递归搜索 + 撤销选择= 回溯

  • 选一条路走
  • 走不通就回退一步
  • 尝试其他可能

典型场景:排列、组合、子集、N 皇后、数独

2. 回溯通用模板(必背)

1

2

3

4

5

6

7

8

9

10

11

voidbacktrack(路径, 选择列表) {

if(满足结束条件) {

记录答案;

return;

}

for(选择 : 选择列表) {

做选择;

backtrack(路径, 选择列表);

撤销选择;// 回溯核心

}

}

四、三个经典例子(一看就懂)

例 1:全排列(回溯经典)

[1,2,3]的所有排列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

vector<vector<int>> res;

vector<int> path;

boolvis[10];

voiddfs(vector<int>& nums) {

if(path.size() == nums.size()) {

res.push_back(path);

return;

}

for(inti = 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:子集(搜索所有可能)

1

2

3

4

5

6

7

8

voiddfs(vector<int>& nums,intu) {

res.push_back(path);

for(inti = u; i < nums.size(); i++) {

path.push_back(nums[i]);

dfs(nums, i + 1);

path.pop_back();

}

}

例 3:斐波那契(纯递归)

1

2

3

4

intfib(intn) {

if(n <= 1)returnn;

returnfib(n-1) + fib(n-2);

}

五、三者关系(一句话总结)

  • 递归:函数自己调用自己,是实现方式
  • 搜索:遍历所有可能,是算法思想
  • 回溯:递归搜索 + 撤销选择,是搜索的一种通用写法

六、最常考题型

  • 全排列、组合、子集
  • N 皇后
  • 数独
  • 电话号码字母组合
  • 矩阵中的路径(单词搜索)
  • 分割回文串

到此这篇关于C++ 递归、搜索与回溯的文章就介绍到这了,

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 5:41:32

C++函数模板与普通函数:重载决议与性能优化指南

1. 函数模板与普通函数&#xff1a;从“一锤子买卖”到“万能模具”刚接触C泛型编程那会儿&#xff0c;我总觉得函数模板这东西有点“玄乎”。它看起来像个函数&#xff0c;用起来也像个函数&#xff0c;但写法和普通函数又不太一样。最让我困惑的是&#xff0c;当我在代码里同…

作者头像 李华
网站建设 2026/8/22 5:40:21

智能车竞赛全栈技术指南:从零构建感知决策控制闭环系统

1. 这篇文章真正要解决的问题如果你是一名电子信息、自动化或计算机相关专业的大学生&#xff0c;正在寻找一个能真正检验和提升自己综合工程能力的项目&#xff0c;那么“全国大学生智能汽车竞赛”绝对是你绕不开的巅峰挑战。但问题来了&#xff1a;面对这项已经举办了二十多届…

作者头像 李华
网站建设 2026/8/22 5:39:09

AI如何通过选择性遗忘提升泛化能力:正则化技术详解

1. 项目概述&#xff1a;当AI学会“忘记”“选择性遗忘可以帮助人工智能学得更好&#xff1f;” 这个标题乍一听有点反直觉。我们通常认为&#xff0c;学习就是记住&#xff0c;记得越多、越牢&#xff0c;模型就应该越聪明。但在实际的人工智能&#xff0c;特别是深度学习模型…

作者头像 李华
网站建设 2026/8/22 5:38:40

文本摘要技术面试要点与实战解析

1. 文本摘要技术面试的核心考察点文本摘要作为自然语言处理(NLP)领域的重要应用方向&#xff0c;在技术面试中通常从三个维度进行考察&#xff1a;算法原理理解、工程实现能力和业务场景适配。我参与过数十场相关岗位的面试评审&#xff0c;发现候选人最容易在以下环节失分&…

作者头像 李华
网站建设 2026/8/22 5:37:46

Ubuntu系统libkmod报错解析与修复:内核模块配置问题排查指南

1. 问题初现&#xff1a;一个令人困惑的启动报错如果你在Ubuntu系统启动时&#xff0c;或者在执行某些系统管理命令&#xff08;比如apt upgrade、modprobe或者与内核模块、磁盘相关的操作&#xff09;后&#xff0c;在终端或系统日志&#xff08;/var/log/syslog、journalctl …

作者头像 李华
网站建设 2026/8/22 5:37:25

Python+Vue招聘信息分析系统开发实战

1. 项目背景与核心价值在当今数字化招聘时代&#xff0c;每天产生的招聘信息数据量呈指数级增长。我最近用PythonVue搭建的招聘信息分析系统&#xff0c;通过数据挖掘技术实现了岗位需求的智能解析。这个项目特别适合想了解就业市场趋势的求职者、需要优化招聘策略的HR&#xf…

作者头像 李华