一、定义
直接或间接调用函数本身,则该函数称为递归函数
二、两个要点
(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;
}
}