递归的基本概念
递归是一种常用的程序设计技术,C语言中,允许函数递归调用。递归是在连续执行某一处理过程时,该过程中的某一步要用到它自身的上一步(或上几步)的结果。在一个程序中,若存在程序自己调用自己的现象就是构成了递归。
如果函数funA在执行过程又调用函数funA自己,则称函数funA为直接递归。如果函数funA在执行过程中先调用函数funB,函数funB在执行过程中又调用函数funA,则称函数funA为间接递归。程序设计中常用的是直接递归。
在数学中递归定义的数学函数是非常常见的。例如,当n为自然数时:
1 当 n=0 时
n * (n-1)! 当 n>0 时
1 当 n=0 时
x * xn-1 当 n>0 时
从数学角度来说,如果要计算出f(n)的值。就必须先算出f(n-1),而要求f(n-1)就必须先求出f(n-2)。这样递归下去直到计算f(0)时为止。由于已知f(0),就可以向回推,计算出f(n)。
当一个问题蕴含了递归关系且结构比较复杂时,采用递归调用的程序设计技巧可以使程序变得简洁,增加了程序的可读性。但递归调用本身是以牺牲存储空间为基础的,因为每一次递归调用都要保存相关的参数和变量。同样,递归本身也不会加快执行速度;相反,由于反复调用函数,还会或多或少地增加时间开销。递归调用能使代码紧凑,并能够很容易地解决一些用非递归算法很难解决的问题。
请注意,所有的递归问题都一定可以用非递归的算法实现,并且已经有了固定的算法。如何将递归程序转化为非递归程序的算法已经超出了本书的范围,感兴趣的读者可以参看有关数据结构的内容。 <!--EndFragment-->