基于C语言的递归与循环关系的研究

| 浏览次数:

摘要本文阐述了作者对于算法设计中递归问题和循环问题的理解,同时讨论了两者间的转换关系,并使用C语言对其中一种转换方式进行了实验,以求在相关算法的优化设计方面能够有所提高。

关键词递归 循环 C语言

中图分类号:TP31文献标识码:A

递归作为一种正对实际问题的程序设计解决方案,在整个编程语言学习及程序设计方面有着极其重要的地位。而在实际的教学环节中对于这样一种具有很高使用价值的编程技术,在讲解上和学生理解上还存在着一定困难。

循环结构是结构化程序设计的三种结构之一,主要应用在处理某些需要重复执行特定语句的情况下,通常在使用循环时我们需要明确三个重要条件:

1> 循环的初始条件;

2> 循环的中止条件(或在什么情况下循环运行);

3> 程序有趋于结束的趋势。

而递归作为一种算法,在数学上我们时这样定义它的,以n的阶乘为例:

0!=1(*)

n!=n*(n-1) 当n>0时 (**)

其中(*)称为基本实例(基本实例的值必须是直接获得的);(**)称为递归归约。递归被定义为:自身定义为一种含有自身简化的形式。那么从形式上我们可以清楚的看到:

1> 每个递归定义必须有一个(或者多个)基本实例;

2> 递归归约最终归结到基本实例;

3> 在基本实例处停止递归。

从中我们不难发现递归的算法形式条件和循环的条件是非常类似的。

那么在运行递归函数时,逻辑上我们可以认为递归函数有无限的自身拷贝(当然这是受限的),完成某个递归调用后,控制返回到先前的调用环境。这同循环算法在思想上也是异曲同工的。所以我们也完全可以编写一个循环结构来替代递归。

造成这种可替代性的主要原因是因为目前为止的编译系统处理递归函数时,在编译之后都是自动将递归转化为循环的。但是和循环不同的是,编译后的递归需要创建一个内存栈来存储递归过程中的临时变量,对于递归函数的调用和返回操作,则分别对应栈的入栈和出栈。

因此任何一个递归程序都可以通过引入堆栈的形式来转化为循环,这种转化其实就是模拟计算机实现递归的过程。你可以考虑人脑来计算递归的过程:先倒过来向前递归,到达最初点以后再正过来向后递推,堆栈的作用就是记住过程中的临时变量。虽然这样做只不过是模拟递归的执行过程,将原来由编译器实现的事情在程序中用代码实现了一遍,但是确实可以通过循环和堆栈的数据结构特性来实现递归的算法和递归函数的功能。

那么基于递归和循环的这种可以相互替代性,我们应当如何选用递归或循环呢?

在大多数编译系统中递归会受栈(编译系统自动分配)的大小限制,如果递归调用的次数很多,就不能使用递归了。一般情况下,递归效率不如循环高,主要是保存栈需要时间,调用函数也需要时间,再加上开辟栈的额外内存开销,从而导致程序性能的降低。递归一般在算法或者数学模型是递归定义的情况下,为了方便编码(主要是理解)才使用。但是我们也应该注意到,依靠栈和循环来模拟递归,在技术上可行,但在提高程序性能上,意义并不明显(两者在编译后,代码几乎完全一样)。只有使用真正意义上的非递归算法才能够在本质上与递归区别开。

这里所谓的非递归算法就是指不引入堆栈等辅助空间进行计算的算法。更确切地说,非递归是指辅助的空间为0或1的算法(即辅助空间的规模和问题的输入规模无关)。但是很遗憾,在目前可计算性理论发展的水平下事实上,一般只能对尾递归或单向递归的情形,都可利用循环的方法,将递归算法改为非递归算法。

当然,另外还有很多方法将递归转化为递推,例如利用Cooper变换和拓广Cooper变换:

[Cooper变换]

输入模式:

f(x) ≡ if b(x) then h(x)

else F(f(k(x)), g(x))

输出模式:

f(x) ≡ G(x, e)

G(x, y) ≡ if b(x) then F(h(x), y)

else G( k(x), F(g(x),y) )

其中:

x, k: TYPE1, k(x) -< x( 符号 -< 表示偏序)

y, G, h, g, f, F: TYPE2

b: boolean

e: F的右单位元,即F(x, e) = x

可用性条件:

(1)F满足结合律,即F(F(x,y),z) = F(x, F(y, z))

(2)F有右单位元e;

(3)b, h, g, k中都不含f

[拓广的Cooper变换]

输入模式:

f(x) ≡ if b(x) then h(x)

else if b1(x) then F1( f( k1(x) ), g1(x) )

...

else if bn(x)then Fn( f( kn(x) ), gn(x) )

else F0( f( k0(x) ),g0(x) )

输出模式:

f(x) ≡ if b(x) then h(x)

else if b1(x) then G1( k1(x), g1(x) )

...

else if bn(x) then Gn( kn(x), gn(x) )

else G0( k0(x), g0(x) )

对于所有的 0≤i≤n,

Gi( x, y) = if b(x) then Fi( h(x), y )

else if b1(x) then Gi( k1(x), F1( g1(x), y ) )

...

else if bn(x) then Gi( kn(x), Fn( gn(x), y ) )

else Gi( k0(x), F0( g0(x), y ) )

其中:

对于所有的 0≤i≤n

x, ki: TYPE1, ki(x) -< x ( 符号-< 表示偏序)

gi, h, Fi, Gi, y: TYPE2

b, bj: boolean, 1≤j≤n

b(x)∧b1(x)∧……∧bn(x) = (空集)

b(x)∨b1(x)∨……∨bn(x) = (全集)

可用性条件:

(1)Fi满足结合律,即Fi( Fj(x, y), z ) = Fj( x, Fi(y, z) ), 0≤i, j≤n

(2)b, bj, h, gi, ki中都不含f, 0≤i≤n, 1≤j≤n

以及T1,T2变换,C变换,RR变换等等,在组合数学理论中已经研究的比较多了。也不再是本文的重点。对此有兴趣的读者可以阅读一下参考书目(2)的第三章和第五章。

综上所述,递归和循环无论在算法上还是在实现上都有着巨大的联系,如采用栈的方法则可以实现所有递归和循环的转换,但是如果只采用非递归算法的循环,则只能够处理原始递归和一些可计算性较大的递归函数。

参考文献

[1][美] Robert Sedgewick.C算法(第一卷).人民邮电出版社,ISBN0-201-31452-5.

[2][美] Kennety H.Rosen.离散数学及其应用.机械工业出版社,ISBN7-111-07577-3.

[3][美] Richard A Brualdi.组合数学.机械工业出版社,ISBN7-111-07569-2.

[4][美] Alfred V.Aho.数据结构与算法.清华大学出版社,ISBN7-302-07564-6.

推荐访问: 递归 循环 语言 关系 研究

【基于C语言的递归与循环关系的研究】相关推荐

工作总结最新推荐

NEW
  • XX委高度重视党校的建设和发展,出台《创建全省一流州市党校(行政学院)实施方案》及系列人才培养政策,为党校人才队伍建设提供了有力的政策支撑。州委党校在省委党校的悉心指导下、州委的正确领导下,深入贯彻落

  • 为推动“不忘初心、牢记使命”主题教育常态化,树牢“清新简约、务本责实、实干兴洛”作风导向,打造忠诚干净担当、敢于善于斗争的执纪执法铁军,经县纪委常委会会议研究,决定在全县纪检监察系统开展“转变作风工作

  • 为进一步发展壮大农村集体经济,增强村级发展活力,按照中共XXX市委抓党建促乡村振兴工作领导小组《关于印发全面抓党建促乡村振兴四个工作计划的通知》要求,工作队与村“两委”结合本村实际,共同研究谋划xx村

  • 今年来,我区围绕“产城融合美丽XX”总体目标,按照“城在林中,水在城中,山水相连,林水相依”以及“城乡一体、景城一体、园城一体”的建设思路,强力推进城市基础设施建设、棚户区改造、房地产开发和城市风貌塑

  • 同志们:新冠疫情发生至今已有近三年时间。三年来,在广大干群的共同努力下,我们坚决打好疫情防控阻击战,集团公司范围内未发生一起确诊病例,疫情防控工作取得了阶段性胜利。当前国际疫情仍在扩散蔓延,国内疫情多

  • 我是毕业于XX大学的定向选调生,当初怀着奉献家乡、服务人民的初心回到XX,在市委的关心关爱下,获得了这个与青年为友的宝贵历练机会。一年感悟如下。一要对党忠诚,做政治坚定的擎旗手。习近平总书记指出,优秀

  • 同志们:今天召开这个会议,主要任务是深入学习贯彻习近平总书记重要指示批示精神,以及李克强总理批示要求,认真落实全国安全生产电视电话会议和全省、全市安全生产电视电话会议精神,研究我县安全生产和安全隐患大

  • 2022年市委政研室机关党的建设工作的总体要求是:坚持以XXX新时代中国特色社会主义思想为指导,全面贯彻党的XX届X中X会和省、市第十二次党代会精神,自觉运用党的百年奋斗历史经验,弘扬伟大建党精神,深

  • 同志们:今天,我们在这里召开市直机关基层党建示范点工作会议,一方面是对各示范点单位进行表彰授牌,另一方面是想通过这种会议交流的方式,给大家提供一个相互学习、取长补短的平台和机会。市直工委历来把创建基层

  • 新冠疫情暴发以来,学校党委坚决贯彻习近平总书记关于疫情防控工作的指示要求和党中央的决策部署,严格执行×××部、×××厅关于疫情防控的系列要求,认真落实驻地防疫部门的工作举措,继承发扬优良传统,以最高标