如何找到循环不变量

时间:2015-10-19 16:53:20

标签: loops loop-invariant

我知道循环不变量是为了证明问题的正确性,但我无法理解如何提出问题,无论问题多么微不足道。这是一个例子,有人可以指出我应该考虑提出一个步骤。我知道循环中正在改变的所有值必须涉及我的不变量。请指导我这个问题,我也必须找到后置条件。解释不仅仅是一个答案;请帮忙。

{M > 0 and N >= 0 }

a = M;
b = N;
k = 1;

while (b > 0) {
    if (b % 2 == 0) {
        a = a * a;
        b = b / 2
    } else {
        b = b – 1;
        k = k * a;
    }
}

{ ? ? }

2 个答案:

答案 0 :(得分:1)

关于循环不变量的棘手部分是没有算法(我意识到)将始终保证"正确"答案。

首先,对于你问题中的算法,尝试遍历程序并找出算法的目标(提示:指数很有趣)。跟踪跟踪变量a,b和k。

例如,使用M = 2N = 1,2,3,...。在几个N值之后,您会注意到变量a,b和k之间的关系将开始发展。

一旦你弄清楚循环不变,后置条件应该很容易想出来。

希望这能为你赢得胜利!

答案 1 :(得分:0)

嗯,你有点落后了。正如你所说,循环不变量的目的是帮助你证明程序的正确性。我猜你没有编写这个程序 - 否则你就知道它是什么了,你会在编写循环之前想出循环不变量,因为这是理解循环是正确的关键。 / p>

那么......程序是什么?你怎么知道这是对的?循环不变量将是你对第二个问题的答案的一部分。

它听起来像这样:在每次迭代的开始和结束时,k = ...... b ....在循环之后,b == 0,所以....,因此程序是正确的。

我不想拼出答案,因为这可能是家庭作业,如果你自己弄明白的话,你只会学习它。