哪家治疗白癜风的医院好 http://pf.39.net/bdfyy/bjzkbdfyy/C语言中,循环是一个不断重复执行的过程,递归是函数自调用的过程,也是一种循环。在理论上,递归和循环是等价的。但在一些特殊的时候,又不尽相同,有栈的限制。这里举几个循环改递归的小案例,深入理解递归的含义及实现要领。
分享如下:
01打印0-9十个整数
比如:打印0-9这十个整数,在C语言中,最常规的方法便是使用循环实现。
提升编写代码的技巧及难点,抑或是知识点的高级应用。使用递归思想,该如何实现呢?
递归也是一种循环,在这个过程中,需要找到两者的相似性,还要确定递归的出口,否则就变成了死循环。
可以定义一个带参数的函数,每次调用自身,参数值不断递减(发生变化),当参数n等于0的时候(递归结束),就找到了出口,反推回去,就依次打印出0到9这十个数字。
递归调用,注意每次调用的层次不同,每次分配形参(形式参数)并非同一变量,且需注意返回的次序。方法f中:
f(intn=9)//第一次调用n=9
…f(intn=8)//第二次调用n=8…f(intn=7)//第三次调用n=7….
打印:n=9在这一层的变量状态(值)为9.……压栈是n等于9,弹栈时,当然n当然也等于9,当一层一层的深入时,是站在栈的顶层,每一次的n是不同的。
“栈”这种数据结构的特点是:先入后出,就像是子弹壳里的子弹,最先放入的子弹是最后打出来的。
循环改递归的关键点:第一要发现逻辑“相似性”;第二不要忘记递归的“出口”。
02打印5-20的区间值
再比如,问题升级:想打印从5到20之间的整数,有起始和结束值,这个如果用递归思想,又该如何实现呢?
参照上题案例代码,可以追加一个起始值参数begin,当n=begin的时候,不断调用自身。也可以参考如下代码思路:
定义一个函数f,也需要传入两个参数:起始值、结束值;先打印起始值,在调用自身时,改变起始begin变量加1;在出口处做判断,如果起始值大于结束值(beginend),则停止递归调用。
03数组求和
如果没有明显的相似性,则需要主动构造;不能相似的原因很可能是缺失参数,递归与数学上的递推公式很类似。比如:对一个数组中的所有元素求累加和,常规的方式是通过循环实现。代码如下:
用递归来实现:如果直接调用数组名,其实只是简单的重复,没有变化。这时候就需要主动构造相似性,可以这样分析:
有人能计算除第一项外,后面几项的和吗?把后面的所有项打包成一个整体。
还里可以添加一个起始的下标begin,求数组中,从begin到结束的元素和,依次递增下标;再考虑出口问题,当下标begin超过数组长度时,则返回0。
04总结
#c语言#任何循环总可以改成递归。构造递归就两条:找相似性和出口。同一题,以递归思想实现的方式可以有很多种,需要读者细细品味和实践。