了解 Java 追踪 table 给定非正式合同的最终价值

Understanding final values of Java tracing table given informal contract

我目前正在进行介绍性编程 class 并被要求解释给定跟踪的最终状态 table 具有循环不变性。底框中的蓝色数字是给定的答案。

如您所见,低价已更新,但根据合同中的信息,我不知道这个数字是如何实现的。

Tracing table

编辑:找到 @maintains 子句中的表达式成立的“边界”值是解决此问题的正确方法吗?

因为n不变,所以high至少可以是81,而low 最大是 9?

因此,如果您像我一样不理解循环不变式的完整定义,将会感到困惑。

A loop invariant 是一个条件语句,在方法开始时、每次迭代前后以及方法结束时为真。否则,它不是有效的循环不变量。

知道变量lowhigh被更新,我们知道它们的值有机会在方法中被改变。另一方面,n 将保持不变。

循环不变量为 low * low <= highlow * low <= n <= high。这些必须在方法体的末尾成立。

循环仅在low * low < high时运行,即循环停止一次low * low >= high。但是,low * low > high 不会发生,因为我们的循环不变量(为清楚起见省略了等于符号)!

因此遵循循环不变量必须成立的规则,并知道 while 循环何时停止,得出的结论是最终值必须是:

低 * 低 = 高.

n 的因数,我们有 low * low = n = high。同样,我们知道 lowhigh 是唯一有机会更改的值。

最后,我们有 low * low = 81 = high

低 = 9,n = 81,高 = 81。