news 2026/5/20 13:00:14

GESP6级C++考试语法知识(二十二、深度优先搜索(二、递归与搜索树))

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GESP6级C++考试语法知识(二十二、深度优先搜索(二、递归与搜索树))


第二课《递归魔法与搜索树》

——DFS 为什么会自己回来?


🌟一、故事开始:神秘的递归魔法塔

1、上节课。

小骑士 DFS 学会了:

一条路走到底!


2、但是。

国王问他了一个问题:

🌟“为什么你总能自己回来?”


3、例如:

起点 ↓ A ↓ B ↓ C

(1)走到 C 没路后。

小骑士居然:

自动回到 B

(2)如果不能探索

再:

回到 A

(3)能探索了:

继续探索别的路

4、🌟国王很好奇的问:

“你怎么记住路线的?!”


5、🌟今天

我们要揭开:

DFS 最大的秘密!


🌟二、DFS 为什么能回来?

答案其实只有两个字:

🌟栈!


1、🌟回忆:什么是栈?

你们已经学过:

Stack(栈)

特点:

后进先出(LIFO)


2、例如:

放书:

先放:1号书 再放:2号书 再放:3号书

拿出来时:

3号先出来 2号再出来 1号最后出来

3、🌟DFS 其实也一样!

例如:

dfs(1) dfs(2) dfs(3)

实际上:

系统偷偷帮你存进了“函数栈”


🌟三、真正理解递归!


1、🌟先看一个最简单例子

#include <iostream> using namespace std; void test(int x) { cout << "进入 " << x << endl; if(x == 3) return; test(x + 1); cout << "离开 " << x << endl; } int main() { test(1); return 0; }

2、🌟大家猜猜输出是什么?

很多同学会认为输出为:

进入1 进入2 进入3 离开3 离开2 离开1

但其实:


3、🌟真正输出:

进入1 进入2 进入3 离开2 离开1

4、🌟为什么没有:

离开3

因为:

if(x == 3) return;

已经直接返回了!


🌟四、程序到底是怎么运行的?

这是最关键部分!


1、🌟开始:

test(1)

输出:

进入1

2、然后:

test(2)

输出:

进入2

3、然后:

test(3)

输出:

进入3

4、此时:

x == 3

所以:

return;

5、🌟重点来了!

程序不会结束!

而是:

回到上一层!

也就是:

test(2)

继续往下执行:

cout << "离开2";

6、然后:

再回到:

test(1)

继续执行:

cout << "离开1";

7、🌟同学们终于明白了!

递归不是:

“重新开始”

而是:

“暂停当前任务”

“去做新任务”

“做完再回来”


🌟五、DFS 的“自动返回”秘密

1、所以:

dfs(...)

真正意思是:


2、🌟“我先去下一层探险”

🌟“探险结束后再回来”


3、🌟这就是 DFS 能回来的原因!

因为:

系统帮你记住了现场!


🌟六、搜索树登场!

1、现在。

我们进入 DFS 最核心思想:

🌟搜索树!


2、🌟例子:

每次+1或者+2,我们画出从数字1到4的路径。

(1)从数字:

1

开始。


(2)每次可以:

+1 或者 +2

直到到达 4。


3、🌟有哪些路线?


第一条

1 → 2 → 3 → 4

第二条

1 → 2 → 4

第三条

1 → 3 → 4

4、🌟把它画出来:

1 / \ 2 3 / \ \ 3 4 4 | 4

5、🌟这就叫:

搜索树!


🌟七、为什么“搜索树”特别重要?

因为:


1、🌟DFS 本质上:

就是:

在搜索树里不断往下走!


2、例如:

DFS 会这样搜:

1 ↓ 2 ↓ 3 ↓ 4

先一条路到底!


3、然后回来:

回到2

再搜:

2 → 4

4、🌟是不是特别像:

“树的 DFS 遍历”!


🌟八、真正开始 DFS 搜索树代码


1、🌟任务

从 1 开始。

每次:

  • +1

  • +2

到达 4。

输出所有路径。


2、🌟代码

#include <iostream> #include <vector> using namespace std; vector<int> path; void dfs(int x) { // 记录路径 path.push_back(x); // 到达终点 if(x == 4) { for(int i = 0; i < path.size(); i++) cout << path[i] << " "; cout << endl; path.pop_back(); return; } // 超过4 if(x > 4) { path.pop_back(); return; } // 两种选择 dfs(x + 1); dfs(x + 2); // 返回上一层前恢复 path.pop_back(); } int main() { dfs(1); return 0; }

🌟九、真正理解这份代码!


🌟1. path 是什么?

vector<int> path;

表示:

当前走过的路线。


例如:

1 → 2 → 3

path 就是:

[1,2,3]

🌟2. push_back

path.push_back(x);

意思:

把当前点加入路径。


🌟3. 到达终点

if(x == 4)

说明:

已经找到一条完整路线!


于是:

输出 path。


🌟4. 为什么要 pop_back?

这是本课最大重点!

path.pop_back();

意思:

返回上一层前

撤销当前操作


🌟5. 否则会发生什么?

路径会乱掉!

例如:

本来:

1 2 3

回去后:

应该恢复:

1 2

🌟6.这就是:

“恢复现场”


🌟十、DFS 最重要的一句话


🌟DFS 的本质:

做选择 ↓ 进入下一层 ↓ 搜索 ↓ 返回 ↓ 恢复现场

🌟十一、本课总结


🌟同学们今天学会了什么?


✅ 递归为什么会回来

因为:

函数栈!


✅ DFS 本质

DFS 是:

不断深入

再不断返回


✅ 什么是搜索树

每种选择:

都会产生新分支。


✅ DFS 在干什么

本质:

在搜索树中遍历。


✅ 为什么需要恢复现场

因为:

回到上一层后

状态必须还原。


🌟十二、课后挑战


🌟挑战1

修改代码:

从:

+1 +2

改成:

+1 +3

看看搜索树变化。


🌟挑战2

目标从:

4

改成:

6

输出所有路径。


🌟挑战3

请孩子:

自己手动画搜索树!

这是 DFS 真正开窍的关键。


🌟下节课预告

下一节:

⚔️《时间倒流术》

同学们将真正理解:


🌟什么叫“回溯”!

以及:

🌟为什么 DFS 要撤销操作!

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

前端正则表达式(?:pattern)的具体使用和介绍

文章目录一、官方解释二、js代码例子解释参考文档一、官方解释 (?:pattern) 是正则表达式中的一种结构&#xff0c;称为“非捕获组”&#xff08;Non-Capturing Group&#xff09;。它允许您将多个字符或子表达式组合在一起&#xff0c;作为一个整体对待&#xff0c;而不捕获…

作者头像 李华
网站建设 2026/5/20 12:59:19

企业级应用如何借助Taotoken实现大模型API的容灾与负载均衡

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 企业级应用如何借助Taotoken实现大模型API的容灾与负载均衡 在构建依赖大模型能力的企业级应用时&#xff0c;服务的连续性与稳定性…

作者头像 李华
网站建设 2026/5/20 12:59:17

Slide通知系统详解:实时获取Reddit消息和更新的完整教程

Slide通知系统详解&#xff1a;实时获取Reddit消息和更新的完整教程 【免费下载链接】Slide Slide is an open-source, ad-free Reddit browser for Android. 项目地址: https://gitcode.com/gh_mirrors/sl/Slide Slide是一款开源无广告的Reddit安卓浏览器&#xff0c;其…

作者头像 李华
网站建设 2026/5/20 12:58:44

别再只用LR了!用GBDT+LR搞定CTR预估,Facebook的工业级实战经验分享

工业级CTR预估实战&#xff1a;GBDTLR组合模型深度解析与避坑指南 在广告点击率&#xff08;CTR&#xff09;预估领域&#xff0c;线性回归&#xff08;LR&#xff09;模型曾长期占据主导地位。但面对海量用户行为数据和复杂特征交互的场景&#xff0c;单纯依赖LR模型已难以满足…

作者头像 李华
网站建设 2026/5/20 12:58:43

从CAN到以太网:一文搞懂UDS在DoCAN和DoIP两种传输层下的报文拆解实战

从CAN到以太网&#xff1a;UDS在DoCAN与DoIP中的协议栈深度解析与实战拆解 在车载诊断系统的演进历程中&#xff0c;统一诊断服务&#xff08;UDS&#xff09;作为应用层协议始终保持着稳定的架构&#xff0c;而其底层传输技术却经历了从传统CAN总线到车载以太网的革命性跨越。…

作者头像 李华