第三章 递归
递归是一种强大的方法,它允许一个对象以其自身更小的形式来定义自己。恐怕没有什么比观察神秘的自然界中出现的递归现象更好的方法来体会递归的重要意义了。想想蕨类植物的叶子,每片叶子的小枝干都是整片叶子的较小缩影;又或者两个反光的物体,相互映射对方的渐远的影像。这样的例子使我们明白尽管大自然的力量是强大的,在许多方面它那种出乎意料的简洁更让我们觉得优美。同样的道理也可用在递归算法上,从很多方面来说递归算法都是简洁而优美的,而且还非常强大。
在计算机科学领域,递归是通过递归函数来实现的。递归函数是一种可以调用自身的函数。每次成功的调用都使得输入变得更加精细,使我们越来越接近问题的答案。大多数开发者都喜欢将大型的问题分解成一些小型的问题,然后分别编写不同的函数去处理它们。然而,许多开发者却并不习惯于用单一函数递归的去解决大型的问题。诚然,以这种方式去看待问题需要一定的适应过程。本章探讨了递归是如何工作的并展示了如何以递归的方式去定义问题。本书中的一些递归方面的例子有树的遍历(见第9章),图中的广度优先和深度优先查找(见第11章),以及排序(见第12章)。
本章的内容包括:
基本递归
一种强大的方法,允许一个问题以其自身越来越小的形式来定义自己。在计算机科学领域,我们通过使用递归函数来解决带有递归性质的问题,也就是用函数自身调用自身。
尾递归
递归的一种形式,这里编译器会为此产生优化过的代码。大多数现代的编译器能够识别出尾递归。为此,只要条件允许我们都应该利用这个特性。
PS:
1、此书(Mastering Algorithms with C)译稿版权归本人(Love_Lei)及好友(bigship)共同所有,未经本人同意谢绝一切转载,并不得抄袭,模仿,盗版!更请大家监督盗版之人!
2、由于本人水平有限,如对译文有任何建议和异议,欢迎大家留言指正,我们共同讨论学习!谢谢!