递归函数,是指函数在执行过程中自己调用了自己。
递归函数调用的本质,系统会将本次函数调用的场景(参数,局部变量,返回地址等)保存在一个栈队列中,系统会不停地往该栈队列压入函数调用的场景,直到达到递归函数的出口为止,到达出口后,再依次将函数场景弹出栈队列,恢复相应的函数场景,完成该次函数调用。
通常,递归函数的优势在于代码的简洁性,相应的也会调来函数调用开销的增加,有利有弊。
通过递归函数的调用本质分析,可以利用栈队列模拟系统行为,转化递归函数为非递归函数。一般情况下,使用栈队列存储函数的参数,手动编码依次调用函数即可。
一般形式的递归函数
void func( arg )
{
if( 'End condition' ) //递归出口
{
return;
}
else
{
arg=Expression;//处理 arg
func(arg);
}
}
利用栈队列转化递归函数
void func( arg )
{
Stack argS;//参数栈队列
argS.push(arg);
while( ! argS.empty() ) //参数栈队列不为空
{
if( 'End condition' )
{
argS.pop();
}
else
{
arg=Expression;//处理 arg
argS.push(arg);
}
}
}
一般的,如果递归函数调用的最终结果和调用自身的先后顺序无关的话(例如M次调用自身和第N次调用自身对调后,最后结果不变),也可以使用堆队列转换递归函数。一个具体的例子就是枚举一个文件夹下的所有文件,包括子文件夹。
附:
1028




被折叠的 条评论
为什么被折叠?



