C语言基础篇——递归函数

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








猜你喜欢

转载自blog.csdn.net/qq_43313035/article/details/83650678
今日推荐