← 编程学习中心
📖

Preparation

8 个课程
1
如何学习编程
2
计算机基础
3
键盘初识与基准键位
4
字母与数字基础
5
Shift键魔法
6
编程符号专精
7
功能键与修饰键
8
键盘学习总结与进阶
📚

Basics

22 个课程
1
什么是编程?
2
Hello World - 你的第一个程序
3
变量基础概念 - 给信息贴标签
4
变量赋值和操作 - 变量的高级用法
5
数据类型基础 - 数字和字符串
6
基础运算符 - 数字运算王国
7
布尔类型与比较运算符 - 程序的判断基础
8
条件判断基础 - 让程序学会做决定
9
变量作用域 - 变量的生存范围
10
条件语句进阶 - 复杂判断与嵌套结构
11
逻辑运算符 - 简化复杂条件判断
12
循环语句 - 程序的重复机器
13
循环进阶 - break、continue与循环控制
14
嵌套循环与作用域
15
循环调试实战技巧
16
循环不变量 - 理解循环的数学规律
17
数组基础 - 数据的收纳盒
18
数组操作方法 - 添加、删除和管理
19
数组高级 - 探索数组的强大功能
20
引用概念 - 变量的不同行为
21
函数基础 - 解决重复代码的秘密武器
22
函数实践与应用 - 巩固基础,实战应用
🚀

Intermediate

11 个课程
1
从控制台到画布 - p5.js初体验
2
图形绘制工具箱 - 基础图形函数
3
让世界多彩 - 颜色系统详解
4
文字的艺术 - 文本绘制与样式
5
球体动起来 - 动画基础入门
6
球体的交互魔法 - 鼠标与条件判断
7
面向对象编程 - Class类与实例
8
球的家族 - 循环与数组应用
9
球的个性 - 函数封装与参数化
10
球的变身 - 形状模式与高级绘制
11
球的世界 - 综合创作项目
🎯

Advanced

6 个课程
1
对象类型
2
对象类型应用
3
自定义类型
4
函数进阶 - 箭头函数与高级编程技巧
5
内置方法 - 字符串与数组的魔法工具
6
Switch语句与字符串模板 - 更优雅的代码表达
← 编程学习中心
📖

Preparation

8 个课程
1
如何学习编程
2
计算机基础
3
键盘初识与基准键位
4
字母与数字基础
5
Shift键魔法
6
编程符号专精
7
功能键与修饰键
8
键盘学习总结与进阶
📚

Basics

22 个课程
1
什么是编程?
2
Hello World - 你的第一个程序
3
变量基础概念 - 给信息贴标签
4
变量赋值和操作 - 变量的高级用法
5
数据类型基础 - 数字和字符串
6
基础运算符 - 数字运算王国
7
布尔类型与比较运算符 - 程序的判断基础
8
条件判断基础 - 让程序学会做决定
9
变量作用域 - 变量的生存范围
10
条件语句进阶 - 复杂判断与嵌套结构
11
逻辑运算符 - 简化复杂条件判断
12
循环语句 - 程序的重复机器
13
循环进阶 - break、continue与循环控制
14
嵌套循环与作用域
15
循环调试实战技巧
16
循环不变量 - 理解循环的数学规律
17
数组基础 - 数据的收纳盒
18
数组操作方法 - 添加、删除和管理
19
数组高级 - 探索数组的强大功能
20
引用概念 - 变量的不同行为
21
函数基础 - 解决重复代码的秘密武器
22
函数实践与应用 - 巩固基础,实战应用
🚀

Intermediate

11 个课程
1
从控制台到画布 - p5.js初体验
2
图形绘制工具箱 - 基础图形函数
3
让世界多彩 - 颜色系统详解
4
文字的艺术 - 文本绘制与样式
5
球体动起来 - 动画基础入门
6
球体的交互魔法 - 鼠标与条件判断
7
面向对象编程 - Class类与实例
8
球的家族 - 循环与数组应用
9
球的个性 - 函数封装与参数化
10
球的变身 - 形状模式与高级绘制
11
球的世界 - 综合创作项目
🎯

Advanced

6 个课程
1
对象类型
2
对象类型应用
3
自定义类型
4
函数进阶 - 箭头函数与高级编程技巧
5
内置方法 - 字符串与数组的魔法工具
6
Switch语句与字符串模板 - 更优雅的代码表达

循环不变量 - 理解循环的数学规律

理解循环的工作原理是掌握编程的关键。今天我们要学习一个非常重要的概念——循环不变量,这个概念将帮助你从数学角度理解循环,写出更清晰、更可靠的循环代码。

循环状态详解:理解循环的关键概念

循环有一个非常关键的概念叫循环不变量。这个概念听起来很高深,但实际上很简单:

循环不变量就是:在循环过程中,某些变量之间始终保持不变的关系。

循环不变量的三个关键时机:

  1. 进入循环之前:关系必须建立好(我们主动保证)
  2. 每次循环结束时:关系仍然成立(我们主动保证)
  3. 退出循环之后:关系依然保持(通常自动成立,也是我们的目标)

数字累加案例中的循环不变量

让我们先看一个完整的累加数字例子:

加载代码编辑器...

在这个例子中,不变量是什么?

每次循环开始时,total 的值正好等于从0加到 number 的结果

让我们验证这个关系:

  • 当 number = 0 时,total 应该是 0
  • 当 number = 3 时,total 应该是 0 + 1 + 2 + 3 = 6
  • 当 number = 5 时,total 应该是 0 + 1 + 2 + 3 + 4 + 5 = 15

为什么这个概念这么重要? 因为这个规律告诉我们:total 和 number 之间有一个固定的数学关系。无论循环执行多少次,这个关系始终成立!

有了这个不变量,我们就可以:

  • 预测结果:知道任意一个变量,就能推算出另一个
  • 检查错误:如果关系不成立,说明代码有问题
  • 理解循环:更容易看懂循环在做什么

让我们详细分析每次循环的状态变化:

第1个时机:进入循环之前

  • number = 0,total = 0
  • 循环不变量成立:total 等于从0加到 number 的结果,即 只加0 = 0
  • ✅ 第1个时机满足:关系在进入循环前建立好

第1次循环:

  • 进入时:number = 0,total = 0(total <= 20,继续)
  • 执行:number = 0 + 1 = 1,total = 0 + 1 = 1
  • 结束时:number = 1,total = 1
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0 + 1 = 1)

第2次循环:

  • 进入时:number = 1,total = 1(total <= 20,继续)
  • 执行:number = 1 + 1 = 2,total = 1 + 2 = 3
  • 结束时:number = 2,total = 3
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0+1+2 = 3)

第3次循环:

  • 进入时:number = 2,total = 3(total <= 20,继续)
  • 执行:number = 2 + 1 = 3,total = 3 + 3 = 6
  • 结束时:number = 3,total = 6
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0+1+2+3 = 6)

第4次循环:

  • 进入时:number = 3,total = 6(total <= 20,继续)
  • 执行:number = 3 + 1 = 4,total = 6 + 4 = 10
  • 结束时:number = 4,total = 10
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0+1+2+3+4 = 10)

第5次循环:

  • 进入时:number = 4,total = 10(total <= 20,继续)
  • 执行:number = 4 + 1 = 5,total = 10 + 5 = 15
  • 结束时:number = 5,total = 15
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0+1+2+3+4+5 = 15)

第6次循环:

  • 进入时:number = 5,total = 15(total <= 20,继续)
  • 执行:number = 5 + 1 = 6,total = 15 + 6 = 21
  • 结束时:number = 6,total = 21
  • ✅ 第2个时机满足:total 仍然等于从0加到 number 的结果(0+1+2+3+4+5+6 = 21)

第3个时机:退出循环之后

  • 状态:number = 6,total = 21(total > 20,循环停止)
  • ✅ 第3个时机满足:total 依然等于从0加到 number 的结果(0+1+2+3+4+5+6 = 21)
  • 为什么通常自动成立? 因为如果前两个时机都满足,第3个时机通常自动成立(但要注意循环终止条件的影响)
  • 为什么这是我们的目标? 因为我们希望循环结束后,变量之间还有确定的数学关系,这样我们就能使用这个结果!

三个时机全部满足! 这证明我们的循环设计是正确的,我们成功地利用循环不变量解决了问题。

这个设计更清晰,因为:

  1. number 从0开始,每次循环先增加再使用
  2. 循环结束后 number 就准确表示实际累加的最后一个数字
  3. 通过循环不变量的概念,帮助我们理解循环的数学规律
  4. 每次循环的状态变化更加直观和可预测

🔍 对比:如果不遵循循环不变量

让我们看看如果不按照这个模式设计会怎么样。假设我们从1开始:

加载代码编辑器...

问题分析:

  • 复杂的最终输出:需要用 number - 1 来得到真正累加的最后一个数字
  • 理解困难:学习者容易混淆 number 的当前值和实际累加的值
  • 逻辑不清晰:变量含义在循环前后不一致

循环不变量被破坏:

  • 在这种设计中,循环不变量变得复杂:total 等于从1到 number-1 的所有数字之和
  • 每次需要减1才能理解数学关系,增加了认知负担

为什么好的设计很重要:

  • 可读性:代码的意图更容易理解
  • 可维护性:后续修改时不容易出错

这个对比展示了循环不变量概念的重要性:遵循循环不变量可以让代码更清晰、更易理解!

平方累加案例中的循环不变量

还记得我们刚才学的循环不变量概念吗?这个概念在平方累加中同样适用:

在这个平方累加例子中,不变量是什么?

每次循环开始时,squareSum 的值正好等于 0² + 1² + 2² + 3² + ... + n² 的结果

让我们验证这个关系:

  • 当 n = 0 时,squareSum 应该是 0² = 0
  • 当 n = 3 时,squareSum 应该是 0² + 1² + 2² + 3² = 0 + 1 + 4 + 9 = 14
  • 当 n = 5 时,squareSum 应该是 0² + 1² + 2² + 3² + 4² + 5² = 0 + 1 + 4 + 9 + 16 + 25 = 55

让我们详细分析每次循环的状态变化:

第1个时机:进入循环之前

  • n = 0,squareSum = 0
  • 循环不变量成立:squareSum 等于从0²加到 n² 的结果,即 只加0² = 0
  • ✅ 第1个时机满足:关系在进入循环前建立好

第1次循环:

  • 进入时:n = 0,squareSum = 0(squareSum <= 100,继续)
  • 执行:n = 0 + 1 = 1,square = 1 * 1 = 1,squareSum = 0 + 1 = 1
  • 结束时:n = 1,squareSum = 1
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² = 1)

第2次循环:

  • 进入时:n = 1,squareSum = 1(squareSum <= 100,继续)
  • 执行:n = 1 + 1 = 2,square = 2 * 2 = 4,squareSum = 1 + 4 = 5
  • 结束时:n = 2,squareSum = 5
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² = 5)

第3次循环:

  • 进入时:n = 2,squareSum = 5(squareSum <= 100,继续)
  • 执行:n = 2 + 1 = 3,square = 3 * 3 = 9,squareSum = 5 + 9 = 14
  • 结束时:n = 3,squareSum = 14
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² = 14)

第4次循环:

  • 进入时:n = 3,squareSum = 14(squareSum <= 100,继续)
  • 执行:n = 3 + 1 = 4,square = 4 * 4 = 16,squareSum = 14 + 16 = 30
  • 结束时:n = 4,squareSum = 30
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² = 30)

第5次循环:

  • 进入时:n = 4,squareSum = 30(squareSum <= 100,继续)
  • 执行:n = 4 + 1 = 5,square = 5 * 5 = 25,squareSum = 30 + 25 = 55
  • 结束时:n = 5,squareSum = 55
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² = 55)

第6次循环:

  • 进入时:n = 5,squareSum = 55(squareSum <= 100,继续)
  • 执行:n = 5 + 1 = 6,square = 6 * 6 = 36,squareSum = 55 + 36 = 91
  • 结束时:n = 6,squareSum = 91
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² + 6² = 91)

第7次循环:

  • 进入时:n = 6,squareSum = 91(squareSum <= 100,继续)
  • 执行:n = 6 + 1 = 7,square = 7 * 7 = 49,squareSum = 91 + 49 = 140
  • 结束时:n = 7,squareSum = 140
  • ✅ 第2个时机满足:squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² + 6² + 7² = 140)

第3个时机:退出循环之后

  • 状态:n = 7,squareSum = 140(squareSum > 100,循环停止)
  • ✅ 第3个时机满足:squareSum 依然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² + 6² + 7² = 140)
  • 为什么通常自动成立? 因为如果前两个时机都满足,第3个时机通常自动成立(但要注意循环终止条件的影响)
  • 为什么这是我们的目标? 因为我们希望循环结束后,变量之间还有确定的数学关系,这样我们就能使用这个结果!

三个时机全部满足! 这证明我们的循环设计是正确的,我们成功地利用循环不变量解决了问题。

这个设计更清晰,因为:

  1. n 从0开始,每次循环先增加再计算平方
  2. 循环结束后 n 就准确表示最后一个计算平方的数字
  3. 通过循环不变量的概念,帮助我们理解平方累加的数学规律
  4. 每次循环的状态变化更加直观,展示了平方数的快速增长特性

总结

通过学习循环不变量概念,我们掌握了:

📚 核心知识

  1. 循环不变量:循环过程中变量之间保持不变的关系
  2. 三个关键时机:进入前、每次结束时、退出后
  3. 数学思维:用数学关系理解循环的工作原理

🎯 实用技巧

  • 明确变量之间的数学关系
  • 确保循环前后变量含义一致
  • 验证三个时机的正确性

🚀 编程思维

  • 抽象思维:从具体执行过程抽象出数学规律
  • 设计思维:在设计时就考虑循环的正确性
  • 验证思维:通过不变量验证代码的正确性

掌握循环不变量概念,你就能够:

  • 设计更清晰的循环代码
  • 快速发现和修复循环错误
  • 理解复杂算法的数学原理
  • 写出更可靠的程序

接下来,让我们学习循环的高级控制技巧,让循环更加灵活和强大!💪

Previous lesson
Previous
循环调试实战技巧
Next
数组基础 - 数据的收纳盒
Next lesson