遞歸算法是一個過程或函數在其定義或說明中又直接或間接調用自身的一種方法,它通常把一個大型而復雜的問題晨晨轉化成與原問題相似的,規模較小的問題來解決,一般來說,遞歸需要邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進,當遞歸條件滿足時,遞歸返回。在使用遞歸時必須要有明確的結束條件,稱為遞歸出口,否則遞歸將無限的進行下去(死鎖)
1、菲波那切數列(順推)
Fibonacci數列是遞歸數列,它的每一項都等於前兩項和,在生物學中,許多生物現象都存在菲波那切數列的規律
//打印輸出20以內的Fibonacci數列 #include<stdio.h> int main(){ int fib[20]={1,1}; for(int i = 2; i < 20; i++){ fib[i] = fib[i-1] + fib[i-2]; } for(int i = 0; i < 20; i++){ printf("%d ",fib[i]); } printf("\n"); return 0; }
2、遞歸逆推算法實現
例子:父親准備一次性湊齊兒子的大學四年學費,然后兒子采用整存領取的方式,每月的月底取出1000元,准備下個月的開支,假設銀行的年利息為1.71%,求出父親最初需要一次性存多少錢,才能保證兒子大學四年的生活開支。
//遞歸逆推 #include<stdio.h> #define FETCH 1000 #define PATE 0.0171 int main(){ double corpus[49]; corpus[48] = (double)FETCH; for(int i = 47; i > 0; i--){ corpus[i] = (corpus[i+1]+FETCH)/(1+PATE/12); } printf("父親需要一次性准備:%.2f元\n",corpus[1]); return 0; }
3、遞歸計算階乘
1 #include<stdio.h> 2 int fact(int n){ 3 if(n<=1) 4 return 1; 5 else 6 return n*fact(n-1); 7 } 8 int main(){ 9 int n; 10 printf("請輸入要計算階乘的一個整數:"); 11 scanf("%d",&n); 12 printf("\n%d的階乘為:%d",n,fact(n)); 13 return 0; 14 }
4、進制之間的轉換(遞歸算法實現)
1 //實現十進制轉任意進制 2 #include<stdio.h> 3 #include<string.h> 4 #include<conio.h> 5 void convto(char *s,int n,int b){//n是十進制數,b是轉換成的進制數 6 char bit[] = {"0123456789ABCDEF"}; 7 int len; 8 if(n == 0){ 9 strcpy(s," "); 10 return ; 11 } 12 convto(s,n/b,b); 13 len = strlen(s); 14 s[len] = bit[n%b]; 15 s[len+1] = '\0'; 16 } 17 int main(){ 18 char s[80]; 19 int i,old,base; 20 printf("請輸入十進制數:"); 21 scanf("%d",&old); 22 printf("\n請輸入要轉換的進制數:"); 23 scanf("%d",&base); 24 convto(s,old,base); 25 printf("\n%s\n",s); 26 getch(); 27 return 0; 28 }
5、漢諾塔
#include<stdio.h> void move(int n,char x,char y,char z){ if(n==1) printf("%c-->%c\n",x,z); else{ move(n-1,x,z,y); printf("%c-->%c\n",x,z); move(n-1,y,x,z); } } int main(){ int n; printf("請輸入漢諾塔的層數:"); scanf("%d",&n); printf("移動步驟如下:\n"); move(n,'x','y','z'); return 0; }