循环不变式的理解

  从算法导论里边,接触到循环不变式这个概念(Loop-invariant),算法导论给出证明过程如下:
初始化:循环的第一次迭代之前,它为真。
保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真。
终止:在循环终止时,不变式为我们提供一个有用的性质,该性质有助于证明算法是正确的。
  首先理解一下为什么要用循环不变式去证明算法的正确性。假如是一个车间的流水线,那么我们为了要保证产品的合格率,有一种做法就是保证前一道工序合格,我这一道工序也合格的话,那么成品终将是合格的,但是这只能针对顺序语句,条件判断语句if能够去检验。但是如果生产线中存在环,我们该怎么办呢?因为每次进入环的产品都不一样,就无法针对单一的一次去做判断。虽然有环,产品有区别,但是他们有共同的一个性质,我们可以找到一个不变量去评判一个产品是否合格。
我们这次拿斐波那契数列解释一下其含义。

#include <iostream>
using namespace std;
int fbnq(int n){
    int a = 0;
    int b = 1;
    int tem;
    for(int i = 0;i < n;i++)
    {
    tem = a;
    a = b;
    b = a + b; 
    }
    return b;
}
int main(){
    cout<<fbnq(5)<<endl;
    return 0;

  初始化:首先证明在第一次循环迭代之前(i = 0)时,循环不变式 立。可以要证明fbnq(0) == 0(a) && fbnq(1) == 1(b)成立。代入 后发现成立。
  保持:再去证明 fbnq(i) == a && fbnq(i+1) == b每次迭代城前 成立。由于对于前边的j=0,1,2,3,4…i-1都已验证成立,那么得到的 fbnq(i) == a,fbnq(i+1) == b也会成立。这是所得斐波那契数列都得 出正确结果,那么下一次迭代增加fbnq(i+1) == a,fbnq(i+2) == b也 将保持循环不变式。
  终止:导致for循环终止的条件时i>=n,因为每次循环i都要加1,那么 有必要使i=n。在循环不变式中用n替代掉i,此时我们的fbnq(n)已经得出 了由原来fbnq(n-1)推理而来的中却结论,此时我们可以推断fbnq(n)已经 得到我们预想的结果。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值