当前位置: 网站首页>小程序开发>400电话办理

祁东小程序制作【祁东企业邮箱】祁东网站外包、祁东微信商城开发、祁东网店美工、祁东淘宝设计

发表日期: 2021-03-27 16:20:13 浏览次数:168

祁东小程序制作【祁东企业邮箱】祁东网站外包、祁东微信商城开发、祁东网店美工、祁东淘宝设计

祁东县,隶属湖南省衡阳市,地处衡阳市西南部、湘江中游北岸,东西狭长,北高南低,总面积1872平方千米。 [1]  截至2020年6月,祁东县下辖4个街道、17个镇、3个乡。 [2]  共368个行政村(社区居委会),总人口105.8万。

祁东县,因县城在祁山之东而得名。古为扬越之地,春秋时属楚国。祁东境内祁剧为全国优秀剧种之一。明朝重臣宁良、陈荐,清廷尚书陈大受,红军将领王如痴,革命志士曹炎,画家管锄非等都孕育于此。当前有祁东籍将军14人,两院院士2人,省部级领导7人,司级领导78人,处级领导1300多人。

湘桂铁路、娄底—衡阳高速公路、泉州—南宁高速公路、祁永高速穿过祁东境内,另有祁东港归阳港区。 [1]  祁东县是“中国黄花之乡”、“将军之乡”、“黑色金属之乡”、“中国曲艺之乡”、“省级文明县城”、“全省城乡环境卫生十佳县”。2018年4月23日,湖南省政府批准祁东县退出贫困县序列。


2.5 证明程序的属性

在本节中,我们将深入到这样一个领域:证明程序能完成它声称能做的工作。在这个领域中,归纳证明起着举足轻重的作用。我们将看到一项技术,它可以解释迭代程序在进行循环的过程中在做些什么。如果理解循环在做什么,基本上就能明白需要对迭代程序有哪些了解。在2.9节中,我们会介绍证明递归程序的属性需要些什么。

2.5.1 循环不变式

要证明程序中循环的属性,关键是要选择循环不变式(或称归纳断言),也就是每次进入循环中某个特定点时都为真的命题S。然后通过对以某种方式衡量循环次数的参数进行归纳,证明该命题S。例如,该参数可以是我们到达某while循环测试的次数,也可以是for循环中循环下标的值,还可以是某个涉及每次循环时都递增1的程序变量的表达式。

示例 2.12

举个例子,我们考虑一下2.2节中SelectionSort的内层循环。以下这几行代码带着与图2-2中相同的编号:

(2)        small = i;(3)        for (j = i+1; j < n; j++)(4)            if (A[j] < A[small])(5)            small = j;复制代码

回想一下,这几行代码的目的是使small等于A[i..n-1]中值最小的元素的下标。要证实该声明为何为真,考虑一下如图2-10所示的该循环的流程图。该流程图展示了执行该程序必需的5个步骤。

图 2-10 SelectionSort内层循环的流程图

1. 首先,需要将small初始化为i,如同在第(2)行中所做的那样。

2. 在第(3)行的for循环开始的时候,要将j初始化为i+1。

3. 接着,需要测试是否有j<n

4. 如果是,就执行有第(4)行和第(5)行组成的循环体。

5. 在循环体结束的位置,需要递增j,并返回测试的位置。

在图2-10中看到,在测试之前有一点被标记为循环不变式命题S(k),我们很快就会发现这是个什么样的命题。第一次到达该测试时,j的值为i+1,而small的值为i。第二次到达该测试时,j的值是i+2,因为j已经递增了一次。因为循环体(第4行和第5两行)会在A[i+1]比A[i ]小的条件下将small置为i+1,所以我们看到small总是A[i ]和A[i+1]中较小的那个的下标。5

5为防止出现持平的情况,small应该是i。不过一般情况下我们会假设不会出现持平的情况,并将“最小元素第一次出现”说成“最小的元素”。

类似地,当第三次到达测试时,j的值是i+3,而small则是A[i..i+2]中最小那个的下标。因此我们将试着证明看似一般规则的如下命题。

命题S(k)。在k 为循环下标j的值的情况下,如果到达第(3)行的for声明中对j<n的测试,那么small的值就是A[i..k-1]中最小元素的下标。

请注意,我们在这里使用字母k 来表示变量j在循环进行时可能具有的值。这不像用j来表示j的值那样烦琐,因为有时候需要保持k不变,而同时j的值又在变化。还要注意,S(k)的表述中有“如果到达……”,这是因为某些k 的值比循环下标j的值更小而使循环中断,所以可能根本没法到达循环测试。如果k 是这些值之一,那么S(k)一定为真,因为任何“若AB”形式的命题在A为假时都为真。

依据。依据情况是k=i+1,其中i为第(3)行中变量i的值。6在循环开始时,有j=i+1。也就是说,我们刚执行完第(2)行,把i赋值给small,并且将j初始化为i+1,以开始该循环。S(i+1)表示,smallA[i..i]中最小元素的下标,也就是说small的值一定是i。从技术上讲,我们还必须证明,除了第一次到达测试时之外,j的值从不可能是i+1。从直观上说,其原因就是每次进行循环时,j都会递增,所以它再也不会有i+1这么小了。(为了精益求精,我们应该在除了第一次通过测试外都有j>i+1的假设下进行归纳证明。)因此,归纳依据S(i+1)被证明为真。

6就行(3)到行(5)的循环而言,i是不会改变的。因此i+1是可用作根据值的合适常数。

归纳。现在假定我们的归纳假设S(k)对某些ki+1成立,并证明S(k+1)为真。首先,如果kn,那么在j的值为k,或更早之前,循环就中断了,所以肯定不会在j的值等于k+1时到达该循环测试。在这种情况下,S(k+1)一定为真。

因此,我们假设k<n,如此一来,实际上已经进行了j等于k+1时的测试。S(k)说的是small表示A[i..k-1]中最小元素的下标,而S(k+1)则是说small表示A[i..k]中最小元素的下标。如果考虑当j的值为k 时循环体(第4行和第5行)中会发生的事情,就会出现如下两种情况,具体取决于第(4)行的测试是否为真。

1. 如果A[k]不小于A[i..k-1]中的最小值,那么small的值不会改变。不过,在这种情况下,small还要表示A[i..k]中最小元素的下标,因为A[k]不是最小的。因此,在这种情况下S(k+1)表述的结论为真。

2. 如果A[k]小于A[i ]到A[k-1]这些值的最小值,那么就要将small置为kS(k+1)表述的结论还是成立,因为k 是A[i..k]中最小元素的下标。

因此,不管哪种情况,small都是A[i..k]中最小元素的下标。我们通过递增变量j来进行for循环。因此,在循环测试之前,当j的值为k+1时,S(k+1)表述的结论成立。现在就证明了由S(k)可以得到S(k+1)。我们已经完成了归纳,并得到S(k)对所有ki+1的值都为真这样的结论。

接下来,应用S(k)来声明第(3)行到第(5)行的内层循环。当j的值达到n 时,程序会退出循环。因为S(n)表示smallA[i..n-1]中最小元素的下标,所以可以得出一个有关内层循环工作方式的重要结论。我们会在下一个示例中看看如何利用这个结论。

示例 2.13

现在,考虑整个SelectionSort函数,我们在图2-11中重现了其核心部分。表示这段代码的流程图如图2-12所示,其中“循环体”是指图2-11中的第(2)到(8)这几行。归纳断言T(m)还是关于在循环终止的测试开始前什么一定为真的命题。通俗地说,就是当i的值为m 时,我们选中较小的m 个元素,并将它们排序在数组开头的位置。更具体地讲就是,我们要通过对m 的归纳证明以下命题T(m)为真。

(1)        for (i = 0; i < n-1; i++) {(2)            small = i;(3)            for (j = i+1; j < n; j++)(4)                if (A[j] < A[small])(5)                    small = j;(6)            temp = A[small];(7)            A[small] = A[i];(8)            A[i] = temp;
           }复制代码

图 2-11 SelectionSort函数的主体

图 2-12 整个选择排序函数的流程图

命题T(m)。如果到达第(1)行中i<n-1的循环测试时变量i的值等于m,那么有:

(a) A[0..m-1]是有序排列的,也就是说,A[0]≤A[1]≤…≤A[m-1]。

(b) A[m..n-1]的所有元素不小于A[0..m-1]中任一元素。

依据。依据情况是m=0。依据为真的原因微不足道。如果考虑命题T(0),那么(a)部分就是说A[0..-1]是已排序的。不过在A[0]、…、A[-1]的范围内没有元素,所以(a)一定为真。类似地,T(0)的(b)部分是说,A[0..n-1]的所有元素都至少与A[0..-1]中任一元素一样大。由于后者描述的范围内没有元素,所以(b)部分也为真。

归纳。在归纳步骤中,假设T(m)对所有的m≥0都为真,并要证明T(m+1)成立。就像在示例2.12中那样,我们又要试着证明形如“若AB ”的命题,而只要A为假,那么这样的命题肯定为真。因此,如果“到达for循环测试时i等于m+1”这一假设为假,那么T(m+1)就为真。因而可以假设我们确实在i的值为m+1时到达了该测试,也就是说,可以假设m<n-1。

i的值为m 时,循环体会找出A[m..n-1]中的最小元素(如示例2.12中命题S(m)所证明的)。在第(6)行至第(8)行中,该元素会与A[m]互换。归纳假设T(m)的(b)部分告诉我们,被选中的这个元素不小于A[0..m-1]中任一元素。此外,那些元素还是已排序的,所以现在A[i..m]中所有元素也是已排序的。这也就证明了命题T(m+1)的(a)部分。

要证明T(m+1)的(b)部分,我们看到所选择的A[m]不大于A[m+1..n-1]中的任一元素。T(m)的(a)部分告诉我们,A[0..m-1]已经不大于A[m+1..n-1]中任一元素了。因此,在执行函数的第(2)行到第(8)行并递增i后,可知A[m+1..n-1]中所有元素都不小于A[0..m]中任一元素。由于现在i的值为m+1,我们证明了命题T(m+1)的真实性,所以就证明了该归纳步骤。

现在,令m=n-1。我们知道,当i的值为n-1时,会退出外层循环,所以T(n-1)将会在完成这次循环后成立。T(n-1)的(a)部分表示,A[0..n-2]中所有元素都是已排序的,而其(b)部分则是说A[n-1]不小于其他任何元素。因此,在该程序终止后,A中的元素是以非递减顺序排列的,也就是说,它们是已排序的。

祁东小程序制作祁东企业邮箱祁东网站外包、祁东微信商城开发、祁东网店美工、祁东淘宝设计

400-111-6878
服务热线
顶部

备案号: 苏ICP备11067224号

CopyRight © 2011 书生商友信息科技 All Right Reserved

24小时服务热线:400-111-6878   E-MAIL:1120768800@qq.com   QQ:1120768800

  网址: https://www.768800.com  网站建设上往建站

关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|

企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|

400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 昌平殡葬| 朝阳殡葬|

预约专家

欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系

  

服务热线:400-111-6878