C語言基礎篇——遞迴函式
阿新 • • 發佈:2018-12-19
一、定義 直接或間接呼叫函式本身,則該函式稱為遞迴函式 二、兩個要點 (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);
}
}