c语言编程f x y 用递推,基于C语言的递归与循环关系的研究

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

E警蚕譬蚕胡

自然科学学科研究计算机科学与技术研究

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

辉…岳莉‘21

湖北 武汉430072;

(【l】武汉大学计算机学院

【2】华中师范大学经济学院湖北 武汉430079)

§4:

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

文献标识码:A

递归作为一种正对实际问题的程序设计解决方案,在整

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

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

l>循环的初始条件;

2>循环的中止条件(或在什么情况下循环运行);3>程序有趋于结束的趋势。

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

O!=l

( )

n!=铂+(n.1)当n>0时

(¨)

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

l>每个递归定义必须有一个(或者多个)基本实例;2>递归归约最终归结到基本实例;3>在基本实例处停止递归。

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

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

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

因此任何一个递归程序都可以通过引入堆栈的形式来转化为循环,这种转化其实就是模拟计算机实现递归的过程。你可以考虑人脑来计算递归的过程:先倒过来向前递归。到达最

万方数据

初点以后再正过来向后递推,堆栈的作用就是记住过程中的临时变量。虽然这样做只不过是模拟递归的执行过程,将原来由编译器实现的事情在程序中用代码实现了一遍,但是确实可以通过循环和堆栈的数据结构特性来实现递归的算法和递归函数的功能。

那么基于递归和循环的这种可以相互替代性,我们应当

如何选用递归或循环呢?

在大多数编译系统中递归会受栈(编译系统自动分配)的

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

这里所谓的非递归算法就是指不引入堆栈等辅助空间进行计算的算法。更确切地说,非递归是指辅助的空间为O或l的算法(即辅助空间的规模和问题的输入规模无关)。但是很

遗憾,在目前可计算性理论发展的水平下事实上,一般只能对尾递归或单向递归的情形,都可利用循环的方法,将递归算法改为菲递归算法。

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

【C00pcr变换】输入模式:

f(x)兰ifb(x)thenh(x)

elsc

F(胀(x)),g(x))

输出模式:f(x)兰G(x,c)

G(x,y)基ifb(x)吐屺nF(h(x),y)

elscG(《x),F(出),y))

其中:

)c,k:下YPEl,k(x).<x(符号-<表示偏序)y,G,h,g,eF:1rYPE2b:b00le锄

e:F的右单位元,即F氏e);x

可用性条件:

(1)F满足结合律,即F(F(,【,y),z)=FkF也z))

(2)F有右单位元e;(3)b,h,g,k中都不含f

露圆圆衄∥麓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值