循环如何利用数学归纳法进行程序开发海量资源_第1页
循环如何利用数学归纳法进行程序开发海量资源_第2页
循环如何利用数学归纳法进行程序开发海量资源_第3页
循环如何利用数学归纳法进行程序开发海量资源_第4页
循环如何利用数学归纳法进行程序开发海量资源_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SimpRead我们在上一讲提到程序有顺序、选择、循环的一种结构。循环结构可以用短短几行代码,执行成千上万次的运算。从计算机编程的视角来看,循环结构又有三种实现方法,分别是forSimpRead我们在上一讲提到程序有顺序、选择、循环的一种结构。循环结构可以用短短几行代码,执行成千上万次的运算。从计算机编程的视角来看,循环结构又有三种实现方法,分别是for循环、while循环和dowhile循环;而从数学视角来看,循环结构很像是纳法。牌还会撞倒第三个骨牌。以此类推,即使骨牌数量再多,也会逐一被放倒。第一,对于任意第i个骨牌而言,它的倒下能带动第i+1个骨牌倒下;“循环”的思想也存在我们的古文化中,《愚公移山》的“又有子,子又有孙;子子孙孙无穷匮也。”简而言之就是,我有儿子,我儿子也有儿子,我儿子的儿子也会有儿子。以此类推,子子孙孙无穷尽。第一,任意一代男子(或者说是儿子),第二,愚公有个儿子。一下。最简单常见的数学归纳法是,用来证明当n等于任意一个自然数时某个命题成立,其证明步骤可以分下第一,当n=1第二,假设对于任意一个数字i命题成立,可以推导出在对于i+1后代,至少有一个儿子。【例1】证明对于任意一个正整数n,它的2n是偶数。第一步,当n=1时,2n=2×1=2是偶数。第二步,假设对于某个正整数i而言,2i是偶数,则2(i+1)=2i+2。其中2i为偶数,2为偶数,两个偶数之和也是偶数,因此2(i+1)也是偶数。根据数学归纳法可以知道,对于任意一个正整数n,2n【例2】求证1+3+5+...+(2k-1)=k2第一步,当k=1时,根据数学归纳法可以知道,对于任意一个正整数n,2n【例2】求证1+3+5+...+(2k-1)=k2第一步,当k=1时,1=12第二步,假设对于任意一个正整数i而言,1+3+5+...+(2i-1)=i2,则1+3+5+...+(2i-1)+[2(i+1)-1]=i2+[2(i+1)-1]=i2+2i+2-1=i2+2i+1=(i+1)2原命题依然成立。因此1+3+5+...+(2k-1)=k2综上这两个例子,你会发现它们都是要证明“下一张多米诺骨牌”能够倒下,也就是在证明“i推进到i+1的过程”。具体而言,这两个例子的第二步都分别在求证2(i+1)是偶数,以及(i+1)2成立,这种数学归到一个循环结构的程序中。我们在大学C语言的课程中曾经学过,循环结构的实现方法有三种,分别是for循环、while循环和do-while循环。为了简洁,下面我们定义s1是初始表达式,s2是条件表达式,s3叫作末尾循环体,s4是中间循环体,并将其代入这三个循环结构中,对比学习它们之间的联系与不同。for如刚刚所定义的,s1是初始表达式,s2是条件表达式,s3叫作末尾循环体,s4for循环的执行顺序是s1、(s2,s4,s3)、(s2,s4,s3)、...、(s2,s4,s3)、s2例如,求解1到50所有整数之和,可以用forintresult=for(inti=1;i<=50;result+=体,最后第4行运算对应的是s4中间循环体。先执行i=1,再判断i≤50与否,如果为真,则执行第4行的运算,最后执行i++;接着循环,再判断i≤50与否,如果为真,则执行第4行的运算,最后执行i++;经过多次循环后,再判断i≤50与否,直到结果为假,跳出循环结束。for循环还有很多变种,具体而言就是s1、s2和s4都可以被省略或部分省略。围绕上面的例子,s1的2fors1的部分,这样新的代码可以写作:intresult=inti=for(;i<=50;result+=intresult=inti=for(;i<=50;result+=根据代码执行的顺序,可以发现s3的执行永远是在s4之后。因此,可以把s3和s4s4intresult=inti=for(;i<=50;result+=同样,s2的执行永远在s4之前,也就意味着s2可以被放在循环体中的s4之前,而把for语句中s2的位置空闲出来。但最后一次的s2执行,还肩负着结束循环的任务,因此需要结合if条件判断语句和break语句,完成最后跳出循环的实现,这样新的代码可以写作:intresult=inti=for(;;if(i>result+=2.whileif(i>result+=2.while循环的另外一个实现方式是while循环,while循环的代码结构如下:如刚刚所定义的,s2是条件表达式,s4是中间循环体。真,则执行s4;继续循环判断s2是否成立,如果为真,则执行s4;如此循环多次后,直到s2不再成我们继续使用while循环来实现1~50inti=intresult=while(i<result+=同样地,如for循环一样,while循环也有一些变种。具体而言,s2也是可以被省略而用其他方法实现。从循环执行的顺序可以发现,s2的执行总是在s4之前;而最后一次s2循环的任务。这就需要if条件语句和breakinti=intresult=whileif(i>resultintresult=whileif(i>result+=3.dowhile最后一种循环实现的方法是dowhile循环,dowhile循环的基本结构如下:如刚刚所定义的,s2是条件表达式,s4是中间循环体。dowhile循环与while循环相比,区别就是执行顺序的调整。dowhile循环中,无论s2是真是假,都会至少执行一次s4。这样它的执行顺序就是(s4,s2)、(s4,s2)...(s4,s2)。具体而言就是:先执行s4,再来判断s2是真是假,如果为真,则执行s4;再来判断s2是真是假,如果为真,则执行s4;再来判断s2是真是假……如此循环多次之后,直到s2为假,跳出循环结束。我们仍以1~50所有整数求和为例,看一下dowhileinti=intresult=doresult+=}while(i<=dowhile循环也有一些变种,其s2语句也可以被调整到其循环体中,可以考虑用if条件语句和inti=intresult=inti=intresult=doresult+=if(i>从代码执行的顺序来看,while循环与for循环都是先判断条件,再执行循环体。在极端情况下,第一次判断条件就不成功,循环体就有可能一次也不被执行;而dowhile循环则相反,它先执行循环体,从编码的视角来看,while循环和dowhile循环,在条件判断的括号中只需要写循环条件;而for循环while循环至少会执行一次循环体,它如何能被其他循环结构替代呢?这就要借助break语句提前跳出在不考虑代码结构的美观时,这三种循环语句可以在功能上实现彼此之间的切换,我们以for向dowhile如下是任意一个for循环其执行顺序为s1、(s2,s4,s3)、(s2,s4,s3)...(s2,s4,s3)、s2它可以用下面的while循环根据其执行顺序为s1、(s2,s4,s3)、(s2,s4,s3)...(s2,s4,s3)、s2它可以用下面的while循环根据while语句的执行顺序可知,这段代码的执行顺序为s1、(s2,s4,s3)、(s2,s4,s3)...(s2,s4,s3)、因此可以得知,两段代码的功能结果完全一致。而如果非要采用dowhile循环do在这里,我们补充一下break语句的知识。break语句的作用是,终止并跳出循环,继续执行循环语句以上面的代码为例,一旦第3行的条件判断通过,则需要执行beak语句。b以上面的代码为例,一旦第3行的条件判断通过,则需要执行beak语句。beak当前循环,这样程序就会从第4行跳转至第10行继续执行。基于beak语句,再根据dowhile语句的执行顺序可知,这段代码的执行顺序为s1、(s2,s4,s3)、(s2,s4,s3)...(s2,s4,s3)、s2,因此可以得知两段代码的功能结果完全一致。这里要给大家提个醒:如果是在技术面试时,千万不要说某某功能的开发,只能用for循环、while循环或dowhile循环,这一定是错的。因为,功能上这三种循环的实现是完全可以实现互换的;只不数学归纳法和循环结构有很多相似之处,它们都是动作集合。数学归纳法不关注归纳过程的结束而循环结构作为一种程序开发逻辑,则必须要关注循环过程的结束或死机。归纳法的问题增加一个截止条件的限制,那就是k小于100时。这道例题是:证明在k<100时,1+3+5+...+(2k-1)=k2证明k=1假设k=i时等式成立后,k=i+1令s1为k=,s4为等式成立,s3为k=i或k=i+1,再补充题目的终止条件k<100为s2。这样,根据for循环执行的逻辑,把这些动作按照s1、(s2,s4,s3)、(s2,s4,s3)...(s2,s4,s3)、s2基本的for循环代码框架。在这个框架中,最开始的s1、s2、s4,即为当k=1在这个框架中,任意相邻的两组(s2,s4,s3)、(s2,s4,s3),就是假设k=i时等式成立后,k=i+1等式也就是说,此时的数学归纳法证明和for循环实现,在功能上是等价的,我们给出for循环的代码如intleft=intleft_temp=intright=for(intk=1;k<100;left_temp=2*k-leftrightk*if(leftprintf("%disleftrightk*if(leftprintf("%dis代码的前三行定义了3个变量,分别是left、left_temp和right,其中left和right分别用来存储等式两边的结果,left_temp用来存储公式中每轮增加的一项;第4行,进入for循环,得到对应的s1、s2和s3;第6行,计算出当前一轮的left_temp值;第7行,把left_temp作为增量,增

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论