正在阅读学习地图
香港天气加载中…
QWeather ↗
← 回到笔记

LEARNING JOURNAL

把理解,连成一张地图.

从一个概念出发,留下追问、延伸和写过的文章。

26 个概念7 篇学习笔记更新于 2026-10-14

2026 年 10 月 13—14 日的编程基础讨论及迭代与递归系列。概念来自讨论与文章中的展开,“已讨论”记录触及过的内容,“已复盘”由你主动标记。

自上而下看概念延伸 · 点击节点查看文章与复盘问题

已复盘 0 / 26 个概念

循环与迭代

从控制下一轮,到解释总工作量

递归与调用栈

从函数调用,到理解尚未完成的状态

递推与深度分析

把正确性、累计工作与峰值状态分开

尾递归与优化

从累加器到运行时的实现边界

递归树与记忆化

沿调用树识别重复子问题

显式栈与算法取舍

保存未完成的动作,再比较实际成本

按概念查看全部文章与复盘问题

for 与 while

for 从迭代器取下一项;while 在每轮开始前检查条件。选用依据是控制机制和可读性。

复盘问题:不查资料,说明两种循环由谁决定下一轮,并各给出一个适用场景。

Python 的 while 与 for:三个循环示例 · 先理解:谁决定下一轮?

迭代

重复执行某些步骤是迭代过程,循环语句是实现它的控制结构;每轮数据和状态可以改变。

复盘问题:解释迭代、循环和遍历的关系,给出一个不需要遍历容器的迭代例子。

理解迭代:for、while 与嵌套循环的复杂度 · 迭代是过程,循环是实现它的控制结构迭代与递归学习系列:42 个知识点的详细讲解与复盘索引 · 01—08 · 循环如何推进

状态与退出条件

步长、状态更新、条件检查和提前退出相互配合。条件存在,还必须能在有限步内到达。

复盘问题:写一个动态步长循环;说明 continue 跳过状态更新时可能发生什么。

Python 的 while 与 for:三个循环示例 · 示例一:根据当前值改变步长理解迭代:for、while 与嵌套循环的复杂度 · break、continue 与循环的退出范围

可迭代对象

可迭代对象提供获取迭代器的能力;for 无需先统计元素总数。

复盘问题:说明 range(3) 与 iter(range(3)) 的区别,并解释逐行读文件为何不需要预先统计行数。

理解迭代:for、while 与嵌套循环的复杂度 · for 的核心:从迭代器取下一项

嵌套循环

循环体中还可以包含循环,但缩进层数不能直接决定时间复杂度。

复盘问题:构造一个两层嵌套但只有线性总工作量的例子。

理解迭代:for、while 与嵌套循环的复杂度 · 复杂度数的是总工作量,不是语法层数

迭代器

保存逐项获取的进度,提供下一项,并用 StopIteration 表示耗尽。迭代范围比迭代器协议更广。

复盘问题:用自己的话区分“重复执行步骤”与“按需提供下一项数据”。

理解迭代:for、while 与嵌套循环的复杂度 · for 的核心:从迭代器取下一项

实际执行次数

按实际行为计算乘积或求和,检查内层状态是否重置、是否跨轮复用,以及是否提前退出。

复盘问题:推导 n²、3n 和 n(n−1)/2 的次数关系;把 n 改成 10 和 100 运行核验。

理解迭代:for、while 与嵌套循环的复杂度 · 三个两层循环:平方、线性与三角形计数理解迭代:for、while 与嵌套循环的复杂度 · 可复现验证:数次数,再解释增长关系

迭代器与递归

继续区分迭代器这种对象协议与递归这种调用组织方式。该追问已讨论,尚未整理成独立文章。

复盘问题:解释这两个概念为何不能简单一一对应;思考迭代器内部能否使用递归。

这个追问已讨论,尚未整理成独立文章。

时间与空间复杂度

总成本还取决于单次操作。倍增推进可以产生 n log n;一层显式循环也可能是平方复杂度。

复盘问题:分别说明共享进度、倍增推进和循环中调用 sum 的总成本;再单独分析额外空间。

理解迭代:for、while 与嵌套循环的复杂度 · 共享进度:两层嵌套也可以是线性的理解迭代:for、while 与嵌套循环的复杂度 · 倍增推进:两层嵌套可以是 n log n理解迭代:for、while 与嵌套循环的复杂度 · 一层循环也能是平方复杂度;时间与空间要分别分析

递归

把问题转化为同类型的子问题,通过新的调用解决子问题,再继续当前层尚未完成的工作。

复盘问题:以 factorial(3) 为例,指出基础情形、递归调用及当前层还剩下的工作。

理解递归:从函数调用到逐层返回 · 递归的核心:解决同类型的子问题迭代与递归学习系列:42 个知识点的详细讲解与复盘索引 · 13—19 · 递归如何求解

调用栈

保存尚未完成的调用状态。普通递归中,上层调用等待子调用返回后再继续。

复盘问题:画出 factorial(3) 到基础情形时尚未结束的调用,再按返回顺序逐层移除。

理解递归:从函数调用到逐层返回 · 交互示例:调用栈如何增长与返回

栈帧与执行状态

每个尚未结束的调用需要保留参数、局部状态和恢复位置;同一函数可对应多份调用状态。

复盘问题:指出一份调用状态至少需要哪些信息;解释只保留一份为何无法正确逐层返回。

理解递归:从函数调用到逐层返回 · 递归与栈:保存尚未完成的工作

独立局部状态

每次调用有自己的局部变量绑定;局部变量独立,不代表引用的对象一定独立。

复盘问题:解释不同调用中的 n 为何互不覆盖,再给出不同局部变量引用同一个列表的例子。

理解递归:从函数调用到逐层返回 · 第一句话:每次调用拥有自己的局部变量绑定理解递归:从函数调用到逐层返回 · 局部变量独立,引用的对象仍然可以共享

返回与恢复位置

子调用返回后,调用者从暂停的表达式继续;如何使用返回值,取决于调用所在的语句。

复盘问题:追踪 child = factorial(n−1) 的求值和绑定顺序;与 return n * factorial(n−1) 比较。

理解递归:从函数调用到逐层返回 · 第二句话:返回后先完成当前语句理解递归:从函数调用到逐层返回 · 返回值怎么使用,取决于调用所在的表达式

多个未结束调用

尚未结束不等于同时运行。在单线程的普通递归中,通常是当前子调用执行,上层等待。

复盘问题:分别指出“当前执行的调用”和“等待中的调用”,解释为什么这不等同于多线程并行。

理解递归:从函数调用到逐层返回 · 第三句话:多个调用尚未结束,但上层在等待理解递归:从函数调用到逐层返回 · 实际输出:逐层恢复使用各自的 n 和 child

递推关系

S(n)=n+S(n−1) 说明当前答案怎样依赖较小问题。

复盘问题:建议练习:推导 S(3),说明每层负责的工作。

理解递归:从函数调用到逐层返回 · 知识点 13—19:从递推关系写出求和递归

基本情况与输入契约

终止条件必须对允许的输入可到达,且给出最小问题的正确答案。

复盘问题:建议练习:比较 n==0 与 n==1 两种基本情况的允许输入。

理解递归:从函数调用到逐层返回 · 终止条件存在,还必须能够到达

调用总数与峰值深度

累计进入次数决定工作量,当前未完成路径决定调用栈峰值。

复盘问题:建议练习:分别数求和与斐波那契的累计调用和峰值深度。

理解递归:从函数调用到逐层返回 · 知识点 24—26:最大深度、调用总数与常数开销

尾递归

子调用的结果直接成为当前调用结果,返回后没有待完成的计算。

复盘问题:建议练习:判断 return n + solve(n−1) 为何不属于尾递归。

理解尾递归:累加器、执行过程与 Python 的优化边界 · 知识点 27:最后一个操作,具体指什么

累加器与不变量

把已完成结果作为下一层参数,用 acc+S(n) 核对总目标。

复盘问题:建议练习:追踪 (3,0) 到 (0,6),说明什么始终保持不变。

理解尾递归:累加器、执行过程与 Python 的优化边界 · 知识点 29:求和从返回阶段移到深入阶段

尾调用优化边界

代码形式和运行时优化分开判断;CPython 不优化用户函数尾调用。

复盘问题:建议练习:解释尾递归形式为什么仍会增加 CPython 调用深度。

理解尾递归:累加器、执行过程与 Python 的优化边界 · 知识点 31:CPython 不优化用户函数的尾调用

递归树

节点对应一次调用,整棵树记录累计过程,不是单次调用栈快照。

复盘问题:建议练习:画出 fib(5) 的九个节点与一个四层调用栈。

理解递归树:斐波那契、调用次数与记忆化 · 知识点 33、35:一个节点对应一次调用

重复子问题

相同参数在不同调用分支重复出现,不会自动复用已有答案。

复盘问题:建议练习:指出两个 fib(3) 的共同答案和重复工作。

理解递归树:斐波那契、调用次数与记忆化 · 知识点 36:调用总数指数增长,峰值深度线性增长

记忆化

缓存减少重复求解,递归深度、缓存容量和失效规则仍需独立分析。

复盘问题:建议练习:说明缓存如何减少 fib(6) 的实际求解次数。

理解递归树:斐波那契、调用次数与记忆化 · 知识点 37:记忆化避免相同输入的重复计算

显式栈与继续阶段

程序保存参数与待完成动作,expanded 标记模拟返回后的继续位置。

复盘问题:建议练习:解释后序遍历为何依次压当前、右子树、左子树。

递归如何变成迭代:显式栈、继续执行的位置与算法取舍 · 复杂场景:后序遍历还要保存继续执行的位置

实现方式的取舍

以结果顺序、最深路径、状态数量和维护成本选择实现方式。

复盘问题:建议练习:比较直接累加、递归、显式栈分别需要保存什么。

递归如何变成迭代:显式栈、继续执行的位置与算法取舍 · 知识点 42:以问题结构和运行约束做选择

THE PATH SO FAR

讨论怎样一步步展开

按可确认的讨论顺序记录;与上方的概念关系一起看,更容易找回当时的问题。

  1. 01

    比较 while 与 for

    while 循环的自由度更高,具体体现在哪里?

    Python 的 while 与 for:三个循环示例 ↗
  2. 02

    追问递归与调用栈

    局部状态、恢复位置与多个尚未结束的调用如何理解?

    理解递归:从函数调用到逐层返回 ↗
  3. 03

    核对迭代与复杂度

    for 必须预知次数吗?每层嵌套都会提高复杂度阶数吗?

    理解迭代:for、while 与嵌套循环的复杂度 ↗
  4. 04

    继续追问迭代器

    迭代器来自迭代的概念吗?为什么没有对称的递归器?

    已讨论 · 待整理成文章
  5. 05

    从 Hello 算法逐项提炼知识

    这页有很多知识点,可以逐一提炼出来吗?

    迭代与递归学习系列:42 个知识点的详细讲解与复盘索引 ↗
  6. 06

    详细讲解并发布系列

    我们是不是可以将这些知识点详细讲解下,然后发布到网上?

    迭代与递归学习系列:42 个知识点的详细讲解与复盘索引 ↗