理解循环的工作原理是掌握编程的关键。今天我们要学习一个非常重要的概念——循环不变量,这个概念将帮助你从数学角度理解循环,写出更清晰、更可靠的循环代码。
循环有一个非常关键的概念叫循环不变量。这个概念听起来很高深,但实际上很简单:
循环不变量就是:在循环过程中,某些变量之间始终保持不变的关系。
循环不变量的三个关键时机:
让我们先看一个完整的累加数字例子:
在这个例子中,不变量是什么?
每次循环开始时,
total的值正好等于从0加到number的结果
让我们验证这个关系:
number = 0 时,total 应该是 0number = 3 时,total 应该是 0 + 1 + 2 + 3 = 6number = 5 时,total 应该是 0 + 1 + 2 + 3 + 4 + 5 = 15为什么这个概念这么重要?
因为这个规律告诉我们:total 和 number 之间有一个固定的数学关系。无论循环执行多少次,这个关系始终成立!
有了这个不变量,我们就可以:
让我们详细分析每次循环的状态变化:
第1个时机:进入循环之前
number = 0,total = 0total 等于从0加到 number 的结果,即 只加0 = 0第1次循环:
number = 0,total = 0(total <= 20,继续)number = 0 + 1 = 1,total = 0 + 1 = 1number = 1,total = 1total 仍然等于从0加到 number 的结果(0 + 1 = 1)第2次循环:
number = 1,total = 1(total <= 20,继续)number = 1 + 1 = 2,total = 1 + 2 = 3number = 2,total = 3total 仍然等于从0加到 number 的结果(0+1+2 = 3)第3次循环:
number = 2,total = 3(total <= 20,继续)number = 2 + 1 = 3,total = 3 + 3 = 6number = 3,total = 6total 仍然等于从0加到 number 的结果(0+1+2+3 = 6)第4次循环:
number = 3,total = 6(total <= 20,继续)number = 3 + 1 = 4,total = 6 + 4 = 10number = 4,total = 10total 仍然等于从0加到 number 的结果(0+1+2+3+4 = 10)第5次循环:
number = 4,total = 10(total <= 20,继续)number = 4 + 1 = 5,total = 10 + 5 = 15number = 5,total = 15total 仍然等于从0加到 number 的结果(0+1+2+3+4+5 = 15)第6次循环:
number = 5,total = 15(total <= 20,继续)number = 5 + 1 = 6,total = 15 + 6 = 21number = 6,total = 21total 仍然等于从0加到 number 的结果(0+1+2+3+4+5+6 = 21)第3个时机:退出循环之后
number = 6,total = 21(total > 20,循环停止)total 依然等于从0加到 number 的结果(0+1+2+3+4+5+6 = 21)三个时机全部满足! 这证明我们的循环设计是正确的,我们成功地利用循环不变量解决了问题。
这个设计更清晰,因为:
number 从0开始,每次循环先增加再使用number 就准确表示实际累加的最后一个数字让我们看看如果不按照这个模式设计会怎么样。假设我们从1开始:
问题分析:
number - 1 来得到真正累加的最后一个数字number 的当前值和实际累加的值循环不变量被破坏:
total 等于从1到 number-1 的所有数字之和为什么好的设计很重要:
这个对比展示了循环不变量概念的重要性:遵循循环不变量可以让代码更清晰、更易理解!
还记得我们刚才学的循环不变量概念吗?这个概念在平方累加中同样适用:
在这个平方累加例子中,不变量是什么?
每次循环开始时,
squareSum的值正好等于 0² + 1² + 2² + 3² + ... + n² 的结果
让我们验证这个关系:
n = 0 时,squareSum 应该是 0² = 0n = 3 时,squareSum 应该是 0² + 1² + 2² + 3² = 0 + 1 + 4 + 9 = 14n = 5 时,squareSum 应该是 0² + 1² + 2² + 3² + 4² + 5² = 0 + 1 + 4 + 9 + 16 + 25 = 55让我们详细分析每次循环的状态变化:
第1个时机:进入循环之前
n = 0,squareSum = 0squareSum 等于从0²加到 n² 的结果,即 只加0² = 0第1次循环:
n = 0,squareSum = 0(squareSum <= 100,继续)n = 0 + 1 = 1,square = 1 * 1 = 1,squareSum = 0 + 1 = 1n = 1,squareSum = 1squareSum 仍然等于从0²加到 n² 的结果(0² + 1² = 1)第2次循环:
n = 1,squareSum = 1(squareSum <= 100,继续)n = 1 + 1 = 2,square = 2 * 2 = 4,squareSum = 1 + 4 = 5n = 2,squareSum = 5squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² = 5)第3次循环:
n = 2,squareSum = 5(squareSum <= 100,继续)n = 2 + 1 = 3,square = 3 * 3 = 9,squareSum = 5 + 9 = 14n = 3,squareSum = 14squareSum 仍然等于从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 = 30n = 4,squareSum = 30squareSum 仍然等于从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 = 55n = 5,squareSum = 55squareSum 仍然等于从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 = 91n = 6,squareSum = 91squareSum 仍然等于从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 = 140n = 7,squareSum = 140squareSum 仍然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² + 6² + 7² = 140)第3个时机:退出循环之后
n = 7,squareSum = 140(squareSum > 100,循环停止)squareSum 依然等于从0²加到 n² 的结果(0² + 1² + 2² + 3² + 4² + 5² + 6² + 7² = 140)三个时机全部满足! 这证明我们的循环设计是正确的,我们成功地利用循环不变量解决了问题。
这个设计更清晰,因为:
n 从0开始,每次循环先增加再计算平方n 就准确表示最后一个计算平方的数字通过学习循环不变量概念,我们掌握了:
掌握循环不变量概念,你就能够:
接下来,让我们学习循环的高级控制技巧,让循环更加灵活和强大!💪