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

祁东网站制作要多少钱【域名企业邮箱服务器注册申请办理】祁东网络优化公司哪家好、祁东软件开发外包价格、祁东高端企业网站页面制作设计专业公司、祁东微信公众号小程序购物支付搭建制作公司

发表日期: 2021-03-27 16:26:49 浏览次数:135

祁东网站制作要多少钱【域名企业邮箱服务器注册申请办理】祁东网络优化公司哪家好、祁东软件开发外包价格、祁东高端企业网站页面制作设计专业公司、祁东微信公众号小程序购物支付搭建制作公司

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

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

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

2.7 递归函数

递归函数是那些在自己的函数体中被调用的函数。这种调用通常是直接的,例如,函数F在它自己中包含对F的调用。不过,有时候这种调用也会是间接的,比如,某函数F1直接调用函数F2F2又直接调用F3,等等,直到该调用链中的函数Fk调用F1

人们通常有这样一种看法,就是学习迭代编程,或者说使用非递归的函数调用,要比学习递归编程更容易。诚然,我们不能完全否定这种观点,但我们相信,只要大家有机会对递归编程加以练习,那么它其实也是很简单的。递归程序往往比等效的的迭代程序更简洁且更易于理解。更重要的是,比起迭代程序,某些问题更容易被递归程序击破。9

9这样的问题往往涉及某种查找。例如,在第5章中我们会看到一些查找树的递归算法,这些算法没有方便的迭代模拟(虽然也存在使用栈的等价迭代算法)。

说几句实在话

使用递归存在潜在的缺点,即在某些计算机上对函数的调用会非常费时,因而与解决同样问题的迭代程序相比,递归程序可能会耗时更多。不过,在很多现代化的计算机上,函数调用是非常高效的,所以反对使用递归程序的这一理由已变得不那么重要。

即便是在函数调用机制较慢的计算机上,人们也可以对程序进行剖析,看看程序的各个部分分别花了多少时间。然后就可以重新编写程序中占用大部分运行时间的部分,如有必要就用迭代替代递归。这样一来,除了速度是最关键因素的一小部分代码之外,程序的大半部分都能利用递归。

通常可以通过模仿待实现程序的规范中的递归定义,来设计递归算法。实现递归定义的递归函数将含有一个依据部分与一个归案部分。依据部分一般会检查可由定义的依据解决的简单输入(不需要递归调用)。函数的归纳部分则需要一次或多次对其本身进行递归调用,并实现定义的归纳部分。下面的例子应该能说明这几点。

示例 2.21

图2-19给出了计算某个非负整数n 的阶乘值n!的递归函数。该函数直接转换了示例2.15中对n!的递归定义。也就是说,图2-19的第(1)行依据情况与归纳情况进行了区分。我们假设n≥1,所以第(1)行的测试其实就是在问是否有n=1。如果是,我们就在第(2)行应用依据规则,得到1!=1。如果n>1,就在第(3)行应用归纳规则n!=n×(n-1)!。

           int fact(int n)
           {(1)            if (n <= 1)(2)                return 1; /* 依据 */
               else(3)                return n*fact(n-1); /* 归纳 */
           }复制代码

图 2-19 计算n≥1时n!的递归函数

例如,如果我们调用fact(4),结果就会调用fact(3),然后调用fact(2),再调用fact(1)。至此,fact(1)会应用依据规则,因为这里有n≤1,并为fact(2)返回值1。这次对fact的调用在第(3)行完成,返回2给fact(3)。接着,fact(3)返回6给fact(4),而fact(4)最后会在第(3)行返回24作为答案。图2-20表示了这些调用和返回的模式。

调用 ↓                                               ↑ 返回 24
    fact(4)                                            fact(4)
     调用 ↓                                  ↑ 返回 6
         fact(3)                               fact(3)
          调用 ↓                       ↑ 返回 2
               fact(2)                   fact(2)
                调用 ↓     ↑ 返回 1
                      fact(1)复制代码

图 2-20 调用fact(4)所带来的调用和返回

防御性程序设计

图2-19中的程序说明了很重要的一点,即编写递归程序时要注意不让它们陷入无限的调用。我们可能暗自假设不会以小于1的参数来调用fact。当然,最好的做法是在调用fact之前测试是否有n≥1,如果n不满足这个条件就打印错误消息并返回某个特定的值(比如0)。不过,即便我们坚信不会以小于1的n来调用fact,也还是要明智一些,在依据情况中包含所有的“错误情况”。这样一来,以错误的输入调用函数fact会直接返回值1,虽然这是不对的,但不至于造成程序出错(其实,对n=0来说,结果为1也是对的,因为0的阶乘等于1)。

然而,假如忽略掉错误情况,并将图2-19的第(1)行写成

if(n == 1)复制代码

那么如果调用了fact(0),它就会被看作递归情况的实例,并会接着调用fact(-1)fact(-2),等等,直到计算机用尽记录递归调用的空间才会出错终止。

我们可以像绘制归纳证明和归纳定义的图那样绘出递归图。在图2-21中,假设存在递归函数的参数“大小”这样一个概念。例如,对示例2.21中的fact函数而言,参数n 的值就具有合适的大小。我们将在2.9节中介绍更多与这种大小有关的内容。不过,在这里要注意的是,递归调用只会调用大小更小的参数。还有,在到达某特定大小时(比如在图2-21中就是大小为0),就必须达到依据情况,也就是必须终止递归。

{%}

图 2-21 递归函数只调用具有更小的参数的本身

fact函数的例子中,调用过程不像图2-21所示那样具有一般性。调用fact(n)会导致对fact(n-1)的直接调用,但fact(n)不会直接调用其他具有更小参数的fact

示例 2.22

如果将底层算法表示为如下形式,就可以将图2-2中的SelectionSort函数变成递归函数recSS。此处假设要排序的数据是在数组A[0..n-1]中。

1. 从数组A的尾部,也就是从A[i..n-1]中,选出最小的元素。

2. 将步骤(1)中选出的元素与A[i]互换。

3. 将剩下的数组A[i+1..n-1]进行排序。

我们可用如下递归算法表示选择排序。

依据。如果i=n-1,那么数组中只有一个元素需要排序。因为任意一个元素都是已排序的,所以我们什么都不用做。

归纳。如果i<n-1,那么要找出A[i..n-1]中最小的元素,将其与A[i]互换,并递归地将A[i+1..n-1]进行排序。

整个算法是从i=0开始执行以上递归的。

如果将i 视作上述归纳中的归纳参数,那么它就是逆向归纳(backward induction)的例子。我们从参数最大的依据开始,通过归纳规则,用较大参数的实例去解决较小参数的实例,这是种特别好的归纳风格,虽然我们之前并未提及它的可能性。不过,还可以将上述归纳视为普通的,或是说“正向”归纳,只要将数组尾部待排序元素的数目k=n-i 作为归纳参数即可。

在图2-22中,我们看到了recSS(A,i,n)程序。其第二个参数i是数组A未排序部分第一个元素的下标,第三个参数n是数组A中待排序元素的总数。不难看出,n是小于等于数组A的最大大小的。因此,调用recSS(A,0,n)会为整个数组A[0..n-1]排序。

     void recSS(int A[], int i, int n)
     {
         int j, small, temp;(1)      if (i < n-1) {/* 依据是i = n-1,在这种情况下,
                 该函数会返回而不改变 */
                 /* 归纳如下 */(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;(9)              recSS(A, i+1, n);
             }
     }复制代码

图 2-22 递归的选择排序

就图2-21而言,s=n-irecSS函数的参数来说是合适的“大小”概念。依据情况是s=1,也就是为一个元素排序,不需要发生递归调用。归纳步骤就讲述了如何通过选出最小元素并排序剩下的s-1个元素来为s 个元素排序。

在第(1)行,我们会测试依据情况,就是只有一个元素需要排序的情况(这里我们再次进行了防御性编程,这样一来,就算在调用时有i ≥n,也不会造成无限的调用)。在该依据情况中,我们无事可做,所以直接返回。

函数其余部分是归纳情况。第(2)至(8)行直接照搬了递归选择排序程序中的内容。就像那个程序那样,这几行会将数组A[i..n-1]最小元素的下标赋值给small,并将该元素与A[i]互换。最后,第(9)行是递归调用,会排序数组其余部分。



祁东网站制作要多少钱域名企业邮箱服务器注册申请办理祁东网络优化公司哪家好、祁东软件开发外包价格、祁东高端企业网站页面制作设计专业公司、祁东微信公众号小程序购物支付搭建制作公司


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