1、循环不变式一 般 而 言 ,用 这 个 式 子 表 示 希 望 得 到 的 结 果 ,如 果 在 循 环 的 每 一 步 ,这 个式 子 都 是 正 确 的 ,那 么 循 环 结 束 后 ,这 个 式 子 也 正 确 ,并 得 到 了 期 望 的 结 果 . lenovo 所 引 用 的 文 章 里 的 例 子 是 这 样 的 : QUOTE: apvector list(n); / n is some positive integer int k, indexMax; indexMax = 0; for(k = 1; k listindexMax) indexMax = k; 这 是 一 个
2、 很 简 单 的 求 最 大 值 (在 数 组 中 的 下 标 )的 问 题 ,在 循 环 内 / invariant true here 处 可 以 指 明 始 终 成 立 的 不 变 式 为 : QUOTE: 在 当 前 的 k 之 前 , 最 大 值 的 下 标 是 indexMax, 而 且 0=indexMaxk 可 以 看 出 这 个 式 子 在 整 个 循 环 过 程 中 是 始 终 成 立 的 ,所 以 在 循 环 结 束 的时 候 (k=list.length(),这 个 式 子 也 成 立 , 即 : QUOTE: 在 整 个 list 中 ,最 大 值 的 下 标 是 i
3、ndexMax, 而 且0=indexMaxlist.length() 这 就 是 我 们 期 望 得 到 的 结 果 ,也 就 是 说 我 们 得 到 了 最 大 值 的 下 标 循 环 不 变 式 有 3 个 性 质 : 初 始 化 : 在 第 一 次 循 环 前 是 正 确 的 保 持 : 在 循 环 迭 代 中 是 正 确 的 终 止 : 当 循 环 结 束 时 也 是 正 确 的 根 据 循 环 不 变 式 的 3 个 特 性 , 再 结 合 归 纳 法 , 证 明 我 们 写 的 循 环 是 正 确滴 。 一 句 话 : ,如 果 在 循 环 的 每 一 步 ,这 个 式 子 都
4、是 正 确 的 ,那 么 循 环 结 束 后 ,这个 式 子 也 正 确 算 法 导 论 中 的 循 环 不 变 性 (loop invariant) 算法导论第二章中的原文是:We state these properties of A1 j -1 formally as a loop invariant。其中举的例子是插入排序,每次循环从数组 A中取出第 j 个元素插入有序区 A1 j-1,然后递增 j。这样 A1 j-1的有序性始终得到保持,这就是所谓的“循环不变”了。 这个概念主要用来检验算法的正确性。原文如下: We use loop invariants to help us un
5、derstand why an algorithm is correct. We must show three things about a loop invariant: Initialization: It is true prior to the first iteration of the loop. Maintenance: If it is true before an iteration of the loop, it remains true before the next iteration. Termination: When the loop terminates, the invariant gives us a useful property that helps show that the algorithm is correct. 1. 初始化(循环第一次迭代之前)的时候, A1 j -1的“有序性”是成立的; 2. 在循环的每次迭代过程中, A1 j -1的“有序性”仍然保持; 3. 循环结束的时候, A1 j -1的“有序性”仍然成立。 另外,我个人认为应该翻译为“循环不变性”,“循环不变式”是一种误导。因为这是一种性质,一种属性(property),而不是表达式。