您的位置:首页 > 编程语言 > C语言/C++

C++基础---递归函数

2015-09-03 20:52 477 查看

1. 递归函数

1.1 递归函数的定义

递归函数:即在函数体中出现调用自身的函数,即函数Func(Type a,……)直接或间接调用函数本身;

递归函数:在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值x0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数;

递归函数:不能定义为内联函数;

1.2 递归的本质

递归函数的例子:

(1)例子一:阶乘n!

递归的数学函数描述:
f(n)=1 (n=1)
f(n)=n*f(n-1) (n>1)


递归的C++函数描述:
unsigned int f(unsigned int n)
{
if(n==1)
return 1;
return n*f(n-1);
}


注:由于f(13)>2^32。所以对于unsigned int型(无符号类型)的表示范围,其n的取值范围只有1<=n<=12了。

(2)例子二:Fibonacci数列

递归的数学函数描述:
f(n)=0 (n=0)
f(n)=1 (n=1)
f(n)=f(n-1)+f(n-2) (n>2)


递归的C++函数描述:
unsigned int f(unsigned int n)
{
if((n==0) || (n==1))
return n;
return f(n-1)+f(n-2) ;
}


注:由于f(47)>2^32。所以对于unsigned int型(无符号类型)的表示范围,其n的取值范围只有1<=n<=46了。

递归有直接递归和间接递归之分:

(1)直接递归:直接调用函数本身;

(2)间接递归:指函数体中没有直接调用自身函数,而是调用了另一个函数,在那个函数里,出现了调用本函数的语句。或者,在那个函数里,又调用了一个其他函数,反复出现调用其它函数,而最后有一个函数调用了本函数;

注:递归函数在运行中,其调用与被调用函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点作为状态的一部分,在栈中被分别保护了起来。因此,是C++的函数机制决定了递归操作中的数据独立性,因而使递归调用成为可能。

1.3 递归条件

递归不能无限制地调用下去,因为栈空间是有限的。所以递归函数是有条件地调用自身,该条件就是递归的停止条件;

递归函数中必须有完成终极任务的语句序列(如:return 1;),以使函数有意义,递归调用,并非终极;

递归函数当然有递归调用语句,递归调用应有参数,而且参数值应该是逐渐逼近停止条件;

递归条件应先测试,后递归调用,无条件递推的逻辑错误,编译器是检查不出来的,要靠程序员自己把握;

注:消去递归,即大多数递归函数都能用非递归函数来替代,一般用循环语句实现。

1.4 递归函数的优缺点

优点:

(1)简化程序设计,使程序易读;

(2)作为对特殊问题的一种处理方法,递归仍然占有一席之地;

(3)许多高难算法的简捷描述,往往采用递归,特别对于能较快逼近停止条件的、优化了的递归函数;

(4)递归在迅速退栈的技术处理上得到了异常机制的帮助;

缺点:

(1)递归会迅速递增系统开销;

(2)在时间上,执行函数的调用与返回的次数明显要大于非递归函数;

(3)在空间上,栈空间资源会遭到空前的劫掠,随着每递归一次,栈内存就会多占用一截;

参考文献:

[1]《C++全方位学习》范磊——第十章

[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章

[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章

[4] 百度搜索关键字:C++函数、递归函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: