第16章:控制循环
第16章:控制循环:从“重复执行某段代码”推进到“边界与终止都能推导”,以目录节点、专属机制实验和故障复位验收。
学习目标
- 选择 while、for、foreach 或带退出的循环,并写出初始化、继续条件与退出后置条件。
- 用不变量和进展量解释循环体为何终止,区分零次、一次、末端和越界一步的边界行为。
- 运行正常、边界和故障输入,保存首个偏离、拒绝理由与重置后的同一轨迹。
为什么需要这一机制
第16章:控制循环 解决的不是一个可背诵口号,而是从 重复执行某段代码 到 边界与终止都能推导 的可观察变化。它的核心机制是:循环用初始化、继续条件、不变量、进展量和退出后置条件建立证明,并对零次、一次、末端和越界邻域测试。
学习 第16章:控制循环 时先预测 循环前状态、进入条件、单次不变量、退出条件、循环后状态 的输入与输出,再改变一个直接条件。最终结果即使看似正确,只要中间状态违反合同、故障不能隔离或重置不能回到同一基线,本页结论就不通过。
核心合同
第16章:控制循环 的合同变量必须绑定到同一版本、同一输入、同一单位和同一观察窗口。先由合同推出预期,再观察 单次不变量 与 循环后状态;如果只是修改阈值来迎合结果,实验失去裁决能力。
目录节点到四级证据
以下节点逐项给出“出现—解释—视觉/实验—练习验证”证据。第16章:控制循环 不把目录词频当作覆盖率;每一项都必须能在专属机制链中指出状态变化,并在章末练习清单中被复核。
第16章 控制循环
在 第16章:控制循环 中,目录节点 第16章 控制循环 落在“循环前状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 第16章 控制循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。
16.1 选择循环的种类
在 第16章:控制循环 中,目录节点 16.1 选择循环的种类 落在“进入条件”检查点。这里的技术含义是:用构造和公开操作守住对象不变量,优先组合稳定职责;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 16.1 选择循环的种类 时,尝试绕过接口制造半有效对象,确认不变量不可被外部破坏。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。
什么时候使用while循环
在 第16章:控制循环 中,目录节点 什么时候使用while循环 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 什么时候使用while循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。
什么时候用带退出的循环
在 第16章:控制循环 中,目录节点 什么时候用带退出的循环 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 什么时候用带退出的循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。
何时使用for循环
在 第16章:控制循环 中,目录节点 何时使用for循环 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 何时使用for循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。
何时使用foreach循环
在 第16章:控制循环 中,目录节点 何时使用foreach循环 落在“循环前状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 何时使用foreach循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。
16.2 循环控制
在 第16章:控制循环 中,目录节点 16.2 循环控制 落在“进入条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 16.2 循环控制 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。
进入循环
在 第16章:控制循环 中,目录节点 进入循环 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 进入循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。
处理好循环体
在 第16章:控制循环 中,目录节点 处理好循环体 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 处理好循环体 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。
退出循环
在 第16章:控制循环 中,目录节点 退出循环 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 退出循环 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。
检查端点
在 第16章:控制循环 中,目录节点 检查端点 落在“循环前状态”检查点。这里的技术含义是:明确角色、准备材料、缺陷分类和修订责任,讨论产物而非个人;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 检查端点 时,让未参与实现者仅凭合同复查并比较独立发现。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。
使用循环变量
在 第16章:控制循环 中,目录节点 使用循环变量 落在“进入条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“控制”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 使用循环变量 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 进入条件 保存首个偏离、拒绝结果和复位后的重放证据。
循环应该有多长
在 第16章:控制循环 中,目录节点 循环应该有多长 落在“单次不变量”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“端点”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 循环应该有多长 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 单次不变量 保存首个偏离、拒绝结果和复位后的重放证据。
16.3 轻松创建循环——由内而外
在 第16章:控制循环 中,目录节点 16.3 轻松创建循环——由内而外 落在“退出条件”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“由内而外”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 16.3 轻松创建循环——由内而外 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 退出条件 保存首个偏离、拒绝结果和复位后的重放证据。
16.4 循环和数组的关系
在 第16章:控制循环 中,目录节点 16.4 循环和数组的关系 落在“循环后状态”检查点。这里的技术含义是:写出循环前状态、不变量、进展量和退出后置条件;它影响“数组关系”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 16.4 循环和数组的关系 时,运行零次、一次、末端一次和越界一步四种样本。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环后状态 保存首个偏离、拒绝结果和复位后的重放证据。
关键点
在 第16章:控制循环 中,目录节点 关键点 落在“循环前状态”检查点。这里的技术含义是:把本单元结论改写为带前提、反例和证据位置的决策规则;它影响“循环种类”时,必须同时声明对象、输入、状态、输出和适用边界,不能用标题出现代替解释。
验证 关键点 时,构造规则不适用的最小反例并说明退出条件。先写预期,再运行正常值、恰好边界和一个故障;若出现“索引与集合长度错一位,或循环体不保证向退出条件推进”,就在 第16章:控制循环 的 循环前状态 保存首个偏离、拒绝结果和复位后的重放证据。
最小可重放实现
# 第16章:控制循环:先建立参考模型,再核对边界
expected = reference_cc2e_16_loops(fixed_input)
actual = run_cc2e_16_loops(fixed_input)
assert actual == expected
assert reset_and_run(fixed_input) == expected这段 第16章:控制循环 验证草图表达独立教学合同,不复制原书代码。真实执行应保存输入、环境、节点轨迹、最终结果、拒绝理由和复位结果,使第二位读者能从干净状态重放。
专属因果实验
先预测改变“循环种类”或“控制”后,第16章:控制循环 的哪一个节点最先变化。切换基线、边界和注入故障,运行并保存证据;最后点击“重置实验”,确认滑块、场景、节点、压力和结果文字全部恢复。
1. 固定循环前状态与循环种类
先猜空集合、单元素和多元素会分别执行几次,再观察初始化与继续条件的关系。
第16章 · 循环合同实验
初始化 → 继续条件 → 循环体 → 进展量 → 退出后状态
先猜首个偏离会发生在哪里,再切换边界或故障,观察循环为何继续、停止或被拒绝。
第 1 / 5 步 · 先写循环前状态:输入集合、索引起点和必须保持的不变量。
先预测,再用单步或播放核对每个节点;最后重置并用同一输入重放。
红色只表示进展合同被破坏;修复的标准是边界、终止和复位后的轨迹都能被另一位读者复算。
故障诊断与误区
术语与边界
第16章:控制循环 的六个操作术语是 ↡进入循环前,输入、索引和资源已经被明确记录的基线状态、↡每次循环体开始和结束时都必须保持的可检查条件、↡决定本轮是否继续执行的布尔或边界判断、↡每次迭代都应向退出条件移动的状态变化、↡循环停止后必须成立的结果条件 和 ↡最小值、最大值、空集合与越界一步等容易暴露错误的输入位置。每个术语都能指向实验控件、节点或状态文本;若只能指向目录标题,说明解释和验证仍未完成。
本页小结
第16章:控制循环 的完成标准是能解释“循环用初始化、继续条件、不变量、进展量和退出后置条件建立证明,并对零次、一次、末端和越界邻域测试”,用核心合同推出预期,沿五个专属节点观察实际,诊断“索引与集合长度错一位,或循环体不保证向退出条件推进”,并证明复位后同一输入重建基线轨迹。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 循环前状态
进入第一次判断前已经确定的输入集合、索引起点、资源和版本;它是重放实验的基线。
- 循环不变量
每次迭代前后都必须成立的条件,例如索引始终落在已处理前缀之后且不超过集合长度。
- 继续条件
决定循环体是否再次执行的判断;它必须说明零次执行和边界停止的结果。
- 进展量
每次迭代都会改变、并且朝退出条件移动的量,如索引递增或剩余任务减少。
- 循环后状态
退出时可检查的结果,包括最终索引、已处理数据和后置条件,而不是一句“循环结束了”。
- 端点
空集合、单元素、最后一个合法值和越界一步等最容易揭示边界错误的输入位置。
练习
- 对空集合、单元素集合和三元素集合,分别写出
for (i = 0; i < items.length; i += 1)的迭代次数、最后一次合法索引和退出时的i。说明这组样本怎样验证循环不变量。
- 找出
while (i < items.length) { use(items[i]); }的最小故障,并给出只改变必要状态的修法。需要保存什么证据才能证明不是靠改阈值蒙对?
- 为“选择循环的种类、循环控制、由内而外、循环和数组的关系”建立四级证据清单:每项各写一个解释、一个实验节点和一个可重放练习。