我认为循环不变性应该是正值的t = sum,但我不知道如何正确编写它,或者是否还有其他循环不变性?
SumPos(A[0..n - 1])
// Returns the sum of the positive numbers in an array A of length n. We
// assume that the sum of the numbers in an array of length zero is
zero.
t = 0
i = 0
while i != n do
if A[i] > 0
t = t + A[i]
i = i + 1
return t
答案 0 :(得分:0)
在正式使用之前,对于循环,考虑“保持不变”和“发生什么变化” 有时会有所帮助。*对于编写的循环,我们具有以下变量:兴趣:
A
-要求和的数字数组n
-A
中元素的整数。t
-按照书面规定,我认为最终的肯定和是i
-索引变量;有时称为变体那么每次迭代有什么变化?数组A
不变。数组中元素n
的数量不变。如前所述,总和t
可能会发生变化。索引变量i
将会更改。
关于循环,人们通常会说i
是变体。它会增加每次迭代的次数,并将其与n
进行比较才能退出循环。
对我而言,不变的是t
将始终表示到目前为止计算出的肯定和。例如,在第一次迭代中:
i == 0
和t
也正确为0 i == 1
和t
将是正确的。但是,按照书面形式,return语句排除了数组第一个元素之外的任何处理。从理论转向实践,那么您如何解决该实现?
*对于pedantic来说,限定符很重要,因为严格来说,“不变式”对于循环的每次迭代都不会改变-不会改变,或者始终成立。所以? 很多语句在循环方面是不变的!例如,我母亲的名字在循环中是不变的!