了解 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 是一个条件语句,在方法开始时、每次迭代前后以及方法结束时为真。否则,它不是有效的循环不变量。
知道变量low和high被更新,我们知道它们的值有机会在方法中被改变。另一方面,n 将保持不变。
循环不变量为 low * low <= high 和 low * low <= n <= high。这些必须在方法体的末尾成立。
循环仅在low * low < high时运行,即循环停止一次low * low >= high。但是,low * low > high 不会发生,因为我们的循环不变量(为清楚起见省略了等于符号)!
因此遵循循环不变量必须成立的规则,并知道 while 循环何时停止,得出的结论是最终值必须是:
低 * 低 = 高.
n 的因数,我们有 low * low = n = high。同样,我们知道 low 和 high 是唯一有机会更改的值。
最后,我们有 low * low = 81 = high。
低 = 9,n = 81,高 = 81。
我目前正在进行介绍性编程 class 并被要求解释给定跟踪的最终状态 table 具有循环不变性。底框中的蓝色数字是给定的答案。
如您所见,低价已更新,但根据合同中的信息,我不知道这个数字是如何实现的。
Tracing table
编辑:找到 @maintains 子句中的表达式成立的“边界”值是解决此问题的正确方法吗?
因为n不变,所以high至少可以是81,而low 最大是 9?
因此,如果您像我一样不理解循环不变式的完整定义,将会感到困惑。
A loop invariant 是一个条件语句,在方法开始时、每次迭代前后以及方法结束时为真。否则,它不是有效的循环不变量。
知道变量low和high被更新,我们知道它们的值有机会在方法中被改变。另一方面,n 将保持不变。
循环不变量为 low * low <= high 和 low * low <= n <= high。这些必须在方法体的末尾成立。
循环仅在low * low < high时运行,即循环停止一次low * low >= high。但是,low * low > high 不会发生,因为我们的循环不变量(为清楚起见省略了等于符号)!
因此遵循循环不变量必须成立的规则,并知道 while 循环何时停止,得出的结论是最终值必须是:
低 * 低 = 高.
n 的因数,我们有 low * low = n = high。同样,我们知道 low 和 high 是唯一有机会更改的值。
最后,我们有 low * low = 81 = high。
低 = 9,n = 81,高 = 81。