如果一个函数在其函数体内直接或间接地调用了自己,该函数就被称为递归函数。递归函数是解决某些复杂问题的十分有效的方法。
》递归适用于:
#数据的定义形式按递归定义。
如Fibonacci数列的定义为:
f(n)=f(n-1)+f(n-2) 当n>1
f(0)=1 当n=0
f(1)=2 当n=1
整数的阶乘定义:
n!=n*(n-1)! 当n>0
0!=1 当n=0
这类递归问题可转化为递推问题,递归边界作为递推的边界条件。
#数据之间的关系(即数据结构)按递归定义,如树的遍历、图的搜索等。
#问题解法按递归算法实现,例如回溯法等。
>示 例
求阶乘n!
#include<iostream>
using namespace std;
int fact(int n)
{
if(n<=1) return 1;
else return n*fact(n-1);
}
int main(){
int k;
do{
cout<<"请输入一个非负数:";
cin>>k;
}while(k<0);
cout<<k<<" 阶乘是 "<<fact(k)<<endl;
system("pause");
return 0;
}
若用fact(3)调用该函数,则执行过程如下:
>调用fact(3),由于n=3(n<=1条件为假),所以函数返回表达式3*fact(2)的值。
>调用fact(2),由于n=2(n<=1条件为假),所以函数返回表达式2*fact(1)的值。
>调用fact(1),由于n=1(n<=1条件为真),所以函数返回数值1。
由于函数调用fact(1)返回值为1,因此,调用fact(2)返回值为2*fact(1)=2*1=2;因此,调用fact(3)返回值为3*fact(2)=3*2=6。
递归算法并不是变成语言所必须的,不用它同样可以实现相应的功能,如上面阶乘例子中,递归函数fact可用下面的非递归方法实现(通常用循环或栈)实现:
int fact(int n)
{
int f=1;
while(n>0){
f*=n;
n--;
}
return f;
}