小学四年级也能看懂的DFS(2、第二课:数字探险队——这次,我们有两条路可以选!)
小学四年级也能看懂的DFS第二课数字探险队——这次我们有两条路可以选本课目标学会让电脑尝试不同的选择初步理解 DFS 的探索过程上一课我们认识了小勇士。他从第 1 级台阶开始一直走到第 4 级。我们学会了用dfs(x 1)让他继续向前走。但是上一课有一个小问题小勇士每次只能往前走 1 步。如果前面还有其他选择电脑又该怎么办呢今天我们就来解决这个问题一、数字王国发布了新任务数字王国里有一条神奇的道路。小勇士从数字 1 出发目标是到达数字 4。这次魔法规则发生了变化每次可以前进 1 步。也可以前进 2 步。例如现在站在数字 1。先问孩子们如果你是小勇士你会选择哪一条路答案是两条路都可以尝试我们不急着判断哪条路更好而是让电脑把不同的可能性都探索一遍。这就是今天的核心想法。二、先不写代码我们自己玩一次我们规定从数字 1 出发。每次可以加 1也可以加 2。到达数字 4就算完成任务。超过数字 4就说明走过头了。我们来看看有哪些走法。我们发现一共有 3 种走法。但是电脑怎么知道要尝试哪条路呢难道我们要把每条路线都手动写出来吗当然不用今天我们就要让电脑自己尝试。三、给电脑一个新本领两种选择都试试上一课我们学过dfs(x 1);意思是从数字x继续走到下一个数字。今天我们多给电脑一个选择dfs(x 1); dfs(x 2);第一句尝试走 1 步。第二句尝试走 2 步。注意这两句不是让小勇士同时走两条路而是让电脑先探索一种走法再回来探索另一种走法。我们先看一段完整的程序。第一版把所有走到的数字都输出#include iostream using namespace std; void dfs(int x) { if (x 4) return; cout x endl; dfs(x 1); dfs(x 2); } int main() { dfs(1); return 0; }这段程序里最重要的变化只有一处以前只有一个dfs(x 1)现在多了一个dfs(x 2)。我们先别着急运行。猜一猜电脑会输出哪些数字四、让电脑带我们探险我们一起追踪电脑的行动。首先执行dfs(1);小勇士站在数字 1。按照程序电脑先执行第一条路dfs(x 1);也就是前往数字 2。到达数字 2 后电脑仍然按照相同规则办事先走 1 步再走 2 步。当电脑走到数字 4 时它还会尝试dfs(5)和dfs(6)。这两次调用都会因为x 4而停止。之后电脑才会回到之前还没尝试的另一条路。这里有一个非常重要的发现电脑不是只走一条路。它会先把眼前的一条路探索下去再回来尝试其他选择。这就是深度优先搜索名字里“深度”的直观含义。五、勇士的岔路口——先走左边再回来走右边1、故事开始森林里的两个岔路口小勇士进入了一片神奇森林。森林里有很多岔路口每个岔路口都有两条路左边的路。右边的路。勇士决定遵守一条规则每次遇到岔路口先走左边。左边走完了再回来走右边。比如勇士来到第一个岔路口。勇士先走左边。如果左边还有岔路口就继续按照同样的规则探索。一直走到没有路可走的地方勇士才会回来继续探索之前没走过的路。这就是 DFS 最重要的想法。2、先不写代码我们用手指走一遍假设勇士要连续经过两个岔路口每次都可以选择左边或者右边。第一个岔路口有两种选择左边记作L。右边记作R。如果第一个岔路口选了左边还要面对第二个岔路口。第二个岔路口也有两种选择L或R。所以勇士可能走出四种路线孩子可以伸出两根手指分别代表两个岔路口。每根手指都能选择L或R。一共就是 2 * 2 4 种走法。但这里有一个重要问题勇士为什么会按照LL → LR → RL → RR的顺序探索而不是乱走呢因为我们给勇士规定了明确的规则先左后右而且要把一条路探索完才轮到下一条。接下来让 C 帮我们完成这件事。3、让 C 也学会走岔路先认识今天的主角void dfs(int x)我们可以把dfs(x)想象成勇士来到了第x个岔路口准备继续探险。当勇士来到第 1 个岔路口就调用dfs(1)。当他来到第 2 个岔路口就调用dfs(2)。为了方便孩子理解我们暂时规定一共只有两个岔路口。当x 3时说明两个岔路口都已经做出选择路线完成了。下面是完整程序。#include iostream using namespace std; void dfs(int x) { if (x 3) { cout 找到一种走法 endl; return; } cout 第 x 个岔路口先走左边 endl; dfs(x 1); cout 第 x 个岔路口再走右边 endl; dfs(x 1); } int main() { dfs(1); return 0; }先别急着背代码。我们重点看下面这几行cout 先走左边 endl; dfs(x 1); cout 再走右边 endl; dfs(x 1);它们就像勇士收到的探险指令先宣布走左边。进入下一层岔路口把那里的事情做完。回到这里。再宣布走右边。再进入下一层岔路口把那里的事情做完。注意第二个dfs(x 1)不会和第一个同时执行。第一个调用里面的事情全部完成后程序才会执行第二个调用。这正是孩子需要理解的关键。4、我们陪着程序一步一步走第一步勇士从第 1 个岔路口出发程序执行dfs(1)。勇士来到第 1 个岔路口先选择左边。执行第一个调用dfs(1 1)也就是dfs(2)。勇士来到了第 2 个岔路口。第二步第 2 个岔路口也先走左边勇士在第 2 个岔路口先走左边。于是程序调用dfs(3)。发现x 3说明两个岔路口的选择已经完成。程序输出“找到一种走法”然后执行return结束这一次调用。第三步回到第 2 个岔路口左边的探索已经结束了勇士回到第 2 个岔路口终于可以走之前还没探索的右边了。程序继续执行第二个dfs(3)。又找到一种走法然后结束这次调用。第四步回到第 1 个岔路口第 2 个岔路口的左右两边都探索完了。所以勇士回到第 1 个岔路口开始探索第 1 个岔路口的右边。这个过程反复进行直到每一条路线都探索完。你会发现程序虽然只有几行但它一直在做同一件事先探索左边回来再探索右边。5、让孩子看见完整的探索顺序下面这棵树就是刚才程序的探险路线。特别提醒孩子们每个叶子节点代表一种完整的走法。为什么是先LL再LR因为勇士先进入第一个岔路口的左边然后把里面的左右两种走法全部探索完才会回到第一个岔路口开始探索右边。这就是“走到底再回来”的含义。六、课堂小练习如果有三个岔路口呢现在把森林变大一点勇士需要连续做出三个选择每个岔路口仍然只有左、右两条路。你觉得一共会有多少种不同走法请选择你的答案4 种 6 种8 种回答正确每个岔路口有 2 种选择连续 3 次选择一共是 2 * 2 * 2 8 种。七、这节课需要记住三句话遇到岔路口就有不同的选择。先走左边把左边探索完再回来走右边。dfs(x 1)执行完了程序才会接着执行下面的dfs(x 1)。这一课最重要的目标是让孩子真正理解程序可以像探险的勇士一样先沿着一条路不断向前走完后再回到之前的岔路口继续探索另一条路。当孩子们能够画出LL → LR → RL → RR的探索顺序再学习迷宫、排列组合和回溯就会容易很多。八、课后小任务去数字王国继续探险请孩子们自己完成下面两个任务。任务一三个岔路口从路口 1 出发每次可以向左 或 向右一共要经过三个岔路口一共有多少种走法。任务二交换探索顺序按照下面两句的顺序交换再观察输出顺序有何变化。dfs(x 2); dfs(x 1);下一课我们就真正走进迷宫小勇士要判断上下左右绕过墙壁寻找出口。我们可以把今天学到的“尝试不同选择”变成一个真正能够解决问题的 C 程序。

相关新闻

SNMP协议从入门到实战:架构、MIB/OID解析与v2c/v3配置排错指南

SNMP协议从入门到实战:架构、MIB/OID解析与v2c/v3配置排错指南

1. 为什么网络管理离不开SNMP这套协议做网络运维的人都有一个共同的痛点:设备一多,靠手工登录逐台排查根本不现实。几十台交换机、路由器、防火墙,再加上服务器和打印机,如果每台都要单独连上去看状态,那基本上一天啥也…

2026/10/19 4:57:06 阅读更多 →
Linux UDP编程从入门到实践:C语言实现服务端与客户端

Linux UDP编程从入门到实践:C语言实现服务端与客户端

如果你正在学Linux网络编程,我建议先别急着扑向TCP那一堆"三次握手、四次挥手"的细节,先把UDP吃透。UDP的代码量小、逻辑直白,跑通一遍之后,你对socket、端口、地址结构、内核收发缓冲区的理解会立刻落地。这篇文章我用…

2026/10/19 4:56:05 阅读更多 →
大模型微调实战:从LoRA参数塑形到DPO行为约束的完整指南

大模型微调实战:从LoRA参数塑形到DPO行为约束的完整指南

大模型微调这个话题,这几年几乎被聊烂了,但真正在一线做过微调项目的人,大多会有一种感受:早期我们以为微调就是把模型的权重往目标任务上"拧";后来发现,光拧权重不够,还得管住模型的…

2026/10/19 4:56:05 阅读更多 →

最新新闻

编译原理语法分析:从CFG理论到工程级错误恢复实战

编译原理语法分析:从CFG理论到工程级错误恢复实战

1. 项目概述:为什么“语法”是编译原理里最常被低估的硬核关卡刚接触编译原理的人,十有八九会把注意力全砸在“词法分析”和“语义分析”上——前者像查字典,后者像解数学题,听着就带感;而“语法”这个词,表…

2026/10/19 5:36:25 阅读更多 →
多线程入侵检测引擎实战:从流量捕获到规则匹配的全链路调优

多线程入侵检测引擎实战:从流量捕获到规则匹配的全链路调优

做安全运营的都知道,流量侧检测一旦上了万兆,很多单线程方案会直接趴窝。我之前在某企业做了一段时间的流量监控优化,手里这套多线程入侵检测系统(下面我习惯叫它 S 引擎)算是我折腾最久、也最有心得的一个项目。它的核…

2026/10/19 5:36:25 阅读更多 →
openGauss gsql 命令行实战:从连接配置到脚本自动化

openGauss gsql 命令行实战:从连接配置到脚本自动化

1. 从一次连接超时说起:为什么值得花时间啃透 gsql刚接触 openGauss 那会儿,我吃过一个不大不小的亏。当时在测试环境里部署完数据库,用图形化工具连上去建表、插数据,一切顺畅,心里还挺得意。结果到了生产环境&#x…

2026/10/19 5:36:25 阅读更多 →
Java对接OPC DA实战:JEasyOpc库从原理到封装

Java对接OPC DA实战:JEasyOpc库从原理到封装

简介:OPC协议是工业自动化领域常见的数据交换标准,负责打通设备与上层软件,Java环境无法原生直接调用该接口,通常需要借助JOPC、JeasyOpc这类第三方库完成桥接。面向需要在Java端对接OPC Server、实现数据采集与读写的开发者&…

2026/10/19 5:36:25 阅读更多 →
JSON-RPC 2.0 实战:从协议到 Flask 服务端与客户端调用

JSON-RPC 2.0 实战:从协议到 Flask 服务端与客户端调用

简介:一份面向 Java Web 开发者的 JSON-RPC 入门案例,精选 jsonrpc4j 及配套依赖,解决从接口调用到工程部署的实践缺口,适合初中级后端工程师快速掌握远程过程调用。资源包共 35 个文件、18.86MB,以 25 个 jar 库为主体…

2026/10/19 5:36:24 阅读更多 →
HTTP头四重校验与X-Forwarded-For绕过实战

HTTP头四重校验与X-Forwarded-For绕过实战

1. 这不是一道“密码题”,而是一次Web安全思维的现场复盘“BUUCTF[ZJCTF 2019]NiZhuanSiWei”——光看标题,很多人第一反应是:“哦,又一个CTF密码题,估计要转进制、换编码、套凯撒……”但真正动手做过这道题的人会发现…

2026/10/19 5:35:24 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →