熟练掌握数学归纳法的思路对于程序员来说是相当重要的。例如,要在程序中编写循环处理(loop) 时数学归纳法是非常有用的。

在编写循环时,找到让每次循环都成立的逻辑表达式很重要。这种逻辑表达式称为循环不变式(loop invariant)。循环不变式相当于用数学归纳法证明的“断言”。

循环不变式用于证明程序的正确性。在编写循环时,思考一下“这个循环的循环不变式是什么”就能减少错误。

光这么说也许不容易理解。我们还是以一个非常简单的例子来讲解循环不变式吧。

代码清单4-2 是用C 语言写的sum 函数,功能是求出数组元素之和。参数array[] 是要求和的对象数组,size 是这个数组的元素数。调用sum 函数,会获得array[0] 至array[size-1] 的size 个元素之和。

代码清单4-2 sum函数,求出数组的元素之和

在sum 函数中使用了简单的while 循环语句。我们从数学归纳法的角度来看这个循环,得出下述断言M(n)。这个断言就是循环不变式。

• 断言M (n ) :数组array 的前n 个元素之和,等于变量s 的值。

我们在程序中成立的断言上标注注释,形成清单4-3 所示代码。

代码清单4-3 在4-2的代码中成立的断言上标注注释

在代码清单4-3 的第4 行,s 初始化为0。由此,第5 行的M(0) 成立。M(0) 即为“数组array 的前0 个元素之和等于变量s 的值”。这相当于数学归纳法的步骤1。

图4-8 数学归纳法的步骤1(M(0)成立)

第7 行中,M(k) 成立。然后进行第8 行的处理, 将数组array[k] 的值加入s, 因此M(k+1) 成立。这相当于数学归纳法的步骤2。

图4-9 数学归纳法的步骤2(M(k) M(k+1)成立)

请一定要理解第8 行,

s=s+array[k];

意为“在M(k) 成立的前提下,M(k+1) 成立”。

第10 行中k 递增1,所以第11 行的M(k) 成立。这里是为了下一步处理而设定变量k的值。

最后,第13 行的M(size) 成立。因为while 语句中的k 递增了1,而这时一直满足M(k), 走到第13 行时k 和size 的值相等。M(size) 成立说明sum 函数是没有问题的。因此,第14 行return 返回结果。

图4-10 M (size )成立

综上所述,这个循环在k 从0 增加到size 的过程中一直保持循环不变式M(k) 成立。编写循环时,有两个注意点。一个是“达到目的”,还有一个是“适时结束循环”。循环不变式M(k) 就是为了确保“ 达到目的”。而k 从0 到size 递增确保了“适时结束循环”。

代码清单4-4 中,写明了M(k) 成立的同时k 递增的情形。(∧表示“并且”)

代码清单4-4 M (k )成立的同时k递增

看了以上循环不变式M(k) 在每次循环时都成立的情形之后,您是否都掌握了呢?

java 里的 循环不变式 百度百科,循环不变式相关推荐

  1. 百度百科里的个人介绍是怎么做上去的,人物百度百科词条创建

    百度百科里的个人介绍都是怎么做上去的,是人工做的百度百科词条,还是机器自动上传的百度百科词条呢?目前来说,人物百度百科词条都是人工做上去的,而且现在百度百科对个人介绍的人物词条要求都是比较严格的.如果 ...

  2. 如何在百度百科里创建一个百科词条,百度百科官网创建词条步骤方法

    很多朋友表示特别希望能在百度百科里创建一个百科词条,但是在百度百科官网却不知如何操作创建百科词条,连最基本的百度百科操作步骤可能都不清楚,下面洛希爱做百科网为大家分享如何在百度百科里创建一个百科词条, ...

  3. Hadoop 百度百科

    Hadoop 百度百科 来源地址:https://baike.baidu.com/item/Hadoop/3526507?fr=aladdin 本词条由"科普中国"百科科学词条编写 ...

  4. 【爬虫实战】10应用Python网络爬虫——定向爬取百度百科文字

    python百度百科爬虫 网页源代码分析 编程实现 小结 网页源代码分析 首先找一下需要爬取的正文: 对应的源代码有两个地方: 上图往后翻会发现省略号,所以下面这张图才是我们需要爬取的部分: 编程实现 ...

  5. 转载百度百科 python

    Python (计算机程序设计语言) 编辑 讨论 Python是一种计算机程序设计语言.是一种动态的.面向对象的脚本语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添 ...

  6. 2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p

    2022-05-22:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个节点 p.q,最近公共祖先表示为一个节点 x,满足 x ...

  7. python爬虫百度百科-如何入门 Python 爬虫?

    目前网上有关网页爬虫的指导有很多,但是套路却是千篇一律,基本都是围绕以下内容进行展开,CSS/html等网页知识 requests或urllib BeautifulSoup或正则表达式 Seleniu ...

  8. python语言百度百科-Python 语言下数据驱动DDT的应用

    数据驱动测试的含义: 在百度百科上的解释是: 数据驱动测试,即黑盒测试(Black-box Testing),又称为功能测试,是把测试对象看作一个黑盒子.利用黑盒测试法进行动态测试时,需要测试软件产品 ...

  9. python爬虫百度百科-python爬虫(一)_爬虫原理和数据抓取

    本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...

最新文章

  1. javascript晚绑定_JavaScript的应用,调用和绑定通过托管野餐来解释
  2. python使用界面-(八)Python 图形化界面设计
  3. copy和mutablecpy区别
  4. java file pathname_int compareTo(File pathname)
  5. thymeleaf 学习笔记
  6. 如何关闭小娜进程_Python多进程之进程间通信 - Pipe amp; Queue
  7. Tomcat7实现Servlet3异步请求
  8. ios开发中的字符串常量如何处理
  9. 心得复述知识体系:《强化学习》中的蒙特卡洛方法 Monte Carlo Methods in Reinforcement Learning
  10. RNN、LSTM、GRU
  11. python groupby用法_Python数据分析黑色星期五-知识点整理
  12. 【趣味学取证】电子数据取证现场勘验知多少?
  13. CC1101接口库在STM32上的移植
  14. mongodb备份oplog_Mongodb 之 oplog进行数据备份恢复
  15. PHPwind9.01傻瓜图解安装教程
  16. 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42...
  17. 计算机冗余,惯性导航计算机系统冗余设计
  18. 40 岁的 C++ 没有中年危机
  19. c++对数函数 log() 操作
  20. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2解码(九)

热门文章

  1. 操作系统(5)-进程调度算法
  2. java B2B2C 仿淘宝电子商城系统-eureka 基础
  3. DSP定点与浮点计算
  4. 【 全干货 】5 分钟带你看懂 Docker ! 1
  5. H3C的DHCP中继配置命令
  6. 《网站性能监测与优化》一2.4 软件服务应用网站
  7. 亚马逊增加了对Aurora的跨区域和加密复制支持
  8. ubutnu 下SVN 提交时忽略某些文件或文件夹
  9. URAL 1404. Easy to Hack! (模拟)
  10. [Linux] linux服务器主机性能、空间监控脚本