一、定义
直接或间接调用函数本身,则该函数称为递归函数
二、两个要点
(1)趋近于一个临界值
(2)调用自己本身
三、举例
(1)求n!
int Fun(int n)
{
int tmp=n;
if(n==1)//临界值
{
tmp=n;
return tmp;
}
else
{
tmp=Fun1(n-1)*n;//调用函数自身
return tmp;
}
}
2.求第n个人的年龄
int Age(int n)//递归对于代码本身来说是纵向执行,思考递归要横向,递归发生在栈上
{
int tmp=10;
if(n==1)//临界条件
{
tmp=10;
return tmp;
}
else
{
tmp=Age(n-1)+2;//调用自身
return tmp;
}
}
函数的压栈顺序:从右往左
int c=Max2(a,b);//从右往左压栈
(3)斐波那契数列的递归算法
int Fibonacci(int n)
{
int tmp;
if(n == 1||n == 2)
{
tmp = 1;
return tmp;
}
else
{
tmp=Fibonacci(n-2)+Fibonacci(n-1);
return tmp;
}
}
(4)斐波那契数列的循环算法
int Fabonico2(int n)
{
if(n == 1 || n== 2)
{
return 1;
}
else
{
return Fabonico2(n-1)+Fabonico2(n-2);
}
}
(5)二分查找的递归算法
int BinSearch(int *str,int p,int q,int key)//p为开始元素下标,q为最后的元素的下标,key为要查找的元素
{
if(p < q)
{
int mid = (q-p)/2 + p;
if(str[mid] == key)
{
return mid;
}
else if(str[mid] > key)
{
return BinSearch(str,p,mid-1,key);
}
else if(str[mid] < key)
{
return BinSearch(str,mid+1,q,key);
}
}
}
(6)汉诺塔
void move(char pos1,char pos2)
{
printf("%c==>%c\n",pos1,pos2);
}
void Hanno(int n,char pos1,char pos2,char pos3)
{
if(n == 1)
{
move(pos1,pos3);
}
else
{
Hanno(n-1,pos1,pos3,pos2);
move(pos1,pos3);
Hanno(n-1,pos2,pos1,pos3);
}
}
(7)递归实现字符串的逆置
void Reverse(char *str)
{
char *pbeign=str;
char *pend=str+strlen(str)-1;
char tmp;
if(strlen(str)<2)
{
return ;
}
else
{
tmp=*pbeign;
*pbeign=*pend;
*pend=’\0’;
Reverse(++str);
*pend=tmp;
}
}