鱼C论坛

 找回密码
 立即注册
查看: 4045|回复: 6

关于"循环不变式"是什么?

[复制链接]
发表于 2012-4-9 22:04:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 只爱你一人 于 2012-4-10 00:23 编辑

近段时间在啃accelerated C++接触到一个叫循环不变式的东西,看了半天,上网找了半天,都没给说清楚循环不变式是个什么东西,只说是用于检查循环的正确性的,我的理解是循环不变式于while循环来说是就是就是它的条件语句呢?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-9 22:56:33 | 显示全部楼层
不是。
条件语句和不不变式没有任何关系。

循环不变式确保每次循环后都得到正确的状态,却不保证循环能结束。正确的条件语句保证循环能结束。

所以不变式+条件语句  就可以得到循环结束后的正确状态。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-9 23:09:38 | 显示全部楼层

那我怎么才能找到循环不变式呢?它是否在程序段里面?难道它只是一个验算方法而以,并不存在于代码里吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-9 23:23:47 | 显示全部楼层
只爱你一人 发表于 2012-4-9 23:09
那我怎么才能找到循环不变式呢?它是否在程序段里面?难道它只是一个验算方法而以,并不存在于代码里吗?

循环不变式当然存在于代码里,事实上一般是先找出循环不变式,再写代码的。
循环体里做的事情归纳起来就是两个:
1.破坏不变式
2.恢复不变式
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-10 00:05:41 | 显示全部楼层
本帖最后由 只爱你一人 于 2012-4-10 00:08 编辑
仰望天上的光 发表于 2012-4-9 23:23
循环不变式当然存在于代码里,事实上一般是先找出循环不变式,再写代码的。
循环体里做的事情归纳起来就 ...

取accelerated C++第2章的例子片段:输出未知行数问题,(变量 r 就是已经输出的行数,rows>=3)

   int r =0;                          这条语句就是“不变式”,它表示当前已经输出的行数,因为还没进入循                       环,所以什么也没输出,即r=0,不变式为真
   while ( r != rows ) {
             cout<<endl;       进入循环后,这条语句输出了一行,即破坏不变式,不变式为假
             ++r;           r自增1,即恢复不变式,不变式又为真
         }
请问是这样吗?
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-4-10 00:18:04 | 显示全部楼层
只爱你一人 发表于 2012-4-10 00:05
取accelerated C++第2章的例子片段:输出未知行数问题,(变量 r 就是已经输出的行数,rows>=3)

   ...

是的,由你所说的不变式可以得出结论:每次循环结束“当前已经输出了r行”这个不变式总是成立的。但这里并没有给出该循环什么时候结束。

这个要根据循环条件r!=row
将其取反,得到r==row
所以循环结束的时候r==row
结合前面的不变式得到:循环结束的时候。已经输出了row行
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-4-10 00:21:47 | 显示全部楼层
仰望天上的光 发表于 2012-4-10 00:18
是的,由你所说的不变式可以得出结论:每次循环结束“当前已经输出了r行”这个不变式总是成立的。但这里并 ...

终于搞明白了!谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-9 02:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表