以下是我的算法和数据结构课程中的一个练习,旨在教授一些关于使用循环不变量分析算法的知识。
设置如下;我们有一个装有n 个弹珠的罐子。大理石要么是红色的,要么是蓝色的。我们还有无数的红色弹珠。我们的目标是通过使用这个算法来清空罐子
算法如下:
input: Jar with *n* marbles each of color RED or BLUE
i <- n
while i > 1 do
Pick two arbitrary marbles m1, m2 from the jar.
if Color(m1) == Color(m2) then
Throw the two marbles away
Place a RED marble in the jar
end
else
Throw away the RED marble
Put the BLUE marble back in the jar
end
i = i - 1
end
1)争辩说,在算法结束时,我们在罐子里留下了 1 个弹珠。我的想法是说我们有一个如下的循环不变式
在 while 循环的迭代开始时,还剩下 n-(ni) 个弹珠
然后证明在初始化、维护和终止期间不变量是正确的,但是我不确定我应该如何处理这个问题,有人可以帮忙吗?
例如,在初始化时,很明显循环不变量是因为我们在 jar 中有n 个弹珠,因此n-0 = n来自不变量,但是我应该如何处理其余的?