从下面的代码中,我需要推导/选择循环不变量。
(|true|)
x = 0 ;
s = 0 ;
while ( x <= n ) {
s = s + x ;
x = x + 1 ;
}
(|s = n(n + 1)/2|)
给出的解决方案是
我不太明白它是如何达到上述解决方案的。
请帮助我如何从代码中派生出这样的解决方案或其他循环不变量。
答案 0 :(得分:0)
给定不变量,你可以很容易地检查它在循环之前,之内和之后是否为真(是的,将从1到n的整数加起来给你(n + 1)* n / 2 - 见{{3 })。由于它涵盖了循环中的所有相关变量(x
和s
),并且无法进一步细化(好吧,你可以添加^ x >= 0
),它是确实是 不变量。
为了自己推断它,我担心你需要预先知道三角数(或半平方)公式。你当然可以为那部分写出s = sum of integers from 1 to x
,而我可以把它作为有效的不变量。 x <= n+1
相对容易的部分。
外行人寻找不变量的方法是尝试写出循环中变量在循环中的生命周期:
然后用数学写出来。