递归
C通过运行时堆栈支持递归函数的实现。递归函数就是直接或者间接调用自身的函数。在函数中直接调用函数本身称为直接递归调用,在函数中调用其他函数,其他函数又调用原函数,称为间接递归调用。
f() a() b()
{ ... {... {...
调用f() 调用b() 调a()
... ... ...
} } }
直接递归调用 间接递归调用
递归算法具有两个基本特征:
(1)递推归纳。将问题转化为比原问题规模小的同类问题,归纳出一般递推公式。
(2)递归终止。当规模小道一定程度是应结束递归调用,逐层返回。常用条件语句来控制何时结束递归。
例:用递归计算斐波那契数
有的方法是用简单循环来代替递归,但这会使效率下降非常多。要记住,在使用递归实现一个函数之前,先问问你自己使用递归的好处是否抵得上它的代价。
long fibonacci(int n)
{ long result;
long previous_result;
long next_older_result;
result=previous_result=1;
while(n>2)
{
n-=1;
next_older_result=previous_result;
previous_result=result;
result=previous_result+next_older_result;
}
return result;
}
递归调用的执行分为两个阶段。第一层是逐层调用,调用的是函数自身。第二阶段是逐层返回,返回到调用该层的位置继续执行后续操作。递归调用的是多重嵌套调用的一种特殊情况,每层都要用堆栈保护主调层的现场和返回地址。调用的层数一般比较多。递归调用的层数称为递归的深度。
如果对递归很有兴趣,还有汉诺塔(hanoi)这种典型的递归问题值得看看。
通过使用递归算法,用一个并不复杂的程序解决了一个很复杂的问题。掌握好这种思维方式,对以后处理类似问题有很大帮助。