1. 程式人生 > >C語言基礎篇——遞迴函式

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);
 }
}