这是数组中线性搜索的伪代码,如果找到数组recyclerView
中的所需元素i
则返回索引e
,否则返回A
(此来自CLRS书,第3版,练习2.1-3):
NIL
我试图从中推断一个循环不变量,所以根据我的理解,我认为一个事实表明,在循环中的任何给定时刻,子数组LINEAR_SEARCH (A, e)
for i = 1 to A.length
if A[i] == e
return i
return NIL
仅包含等值测试证明错误的值。
具体地说,在第一次迭代A[1..i-1]
之前,这意味着子数组的长度为空,因此不能有属于它的元素i-1 == 0
,以便v
。在任何下一次迭代之前,同样测试也是一个退出条件,假定的不变属性必须仍然为true,否则循环已经结束。在终止时,要么函数即将返回一个索引(在这种情况下,循环不变量通常是真的),或者返回NIL(在这种情况下是v == e
,所以循环不变量适用于任何i == A.length + 1
)。
以上是否正确?如果不是,请你提供正确的循环不变量?
感谢您的关注。
答案 0 :(得分:1)
循环不变:在for循环的每次迭代开始时,我们A[j] != e
都有j < i
。
初始化:在第一次循环迭代之前,由于数组为空,因此保持不变。
维护:在每次迭代时都会维护循环不变量,否则在第i
次迭代时会有j < i
个A[j] == e
}。但是,在这种情况下,对于循环的j
次迭代,返回值j
,并且循环没有i
次迭代,这是一个矛盾。
终止当循环终止时,可能有两种情况:一种是在i <= A.length
次迭代后终止,并返回i
,在这种情况下有条件的if
确保A[i] == e
。另一种情况是i
超过A.length
,在这种情况下,我们对所有j <= A.length
,A[j] != e
的循环不变量,这个返回的NIL是正确的。