遞歸本質上還是一種函數的嵌套調用。
底下是幾個關於遞歸的一些常見應用的小例子。
1.斐波那契數列,遞歸在遞推上的應用。
/*遞推用遞歸來求解時,主要找最后一步怎么來求解和邊界條件,即第一步*/
1 int fibonacci(int n) 2 { 3 if(n==1||n==2) 4 return 1; 5 else 6 return (n+fibonacci(n-1)+fibonacci(n-2)); 7 }
2.十進制轉二進制
1 void convert(int n) 2 { 3 int m; 4 if(n!=0)//當等於0時n為1或者0,直接輸出 5 { 6 7 convert(n/2); 8 9 printf("%d",n%2);//輸出放在遞歸調用之后,因為輸出是反向的 10 11 } 12 else 13 printf("%d",n); 14 }
3.漢諾塔問題
1 void hanoi(int n,char x,char y,char z) 2 { 3 /*第一次直接從x移到z 4 第二次先從x移到y,再從x移到z,最后從y移到z 5 第三次先將前兩個借助z從x移到y,再將x移到z,在把y上的兩個借助x移到z 6 ...... 7 類推。 */ 8 if(n==1) 9 printf("%c-->%c\n",x,z); 10 else 11 { 12 hanoi(n-1,x,z,y); 13 printf("%c-->%c\n",x,z); 14 hanoi(n-1,y,x,z); 15 } 16 }
4.從(0,0)到(m,n)走只能向上或者向右走,一次只能走一步有多少種走法 (利用遞歸把問題化為縮小了的同類問題的子問題)
1 int fun(int m,int n) 2 { 3 if(m==0&&n==0) 4 { 5 return 0; 6 } 7 else if(m==0||n==0) 8 return 1; 9 else 10 return (fun(m-1,n)+fun(m,n-1)); 11 }