1、炮彈一樣的球狀物體,能夠堆積成一個金字塔,在頂端有一個炮彈,它坐落在一個4個炮彈組成的層面上,而這4個炮彈又坐落在一個9個炮彈組成的層面上,以此類推。寫一個遞歸函數CannonBall,這個函數把金字塔的高度作為參數,並且返回它所包括的炮彈數量。函數必須按照遞歸方式實現,不可以使用迭代結構,例如while或for。

1 int CannonBall(int h) 2 { 3 if(h == 1) return 1; 4 else 5 return CannonBall(h-1) + pow(h,2); 6 } 7 8 int main(void) 9 { 10 printf("%d\n",CannonBall(4)); 11 return 0; 12 }
2、使用C編寫一個指數函數,實現n^k

1 int RaiseToPower(int n, int k) 2 { 3 if(k == 0) 4 return 1; 5 else 6 return n * RaiseToPower(n,k -1); 7 } 8 9 int main() 10 { 11 printf("%d\n",RaiseToPower(3,4)); 12 return 0; 13 }
3、使用歐幾里得公式寫一個遞歸函數gcd(m,n),用來計算m與n的最大公約數.

1 int gcd(int m, int n) 2 { 3 if(m % n ==0) 4 return n; 5 else 6 return gcd(n,m % n); 7 } 8 9 int main() 10 { 11 printf("%d\n",gcd(18,4)); 12 return 0; 13 }
4、寫一個遞歸函數DigitSum(n),輸入一個非負整數,返回組成它的數字之和,例如,調用DigitSum(1729),則應該返回1+7+2+9,它的和是19

1 int DigitSum(int n) 2 { 3 if(n < 10) 4 return n; 5 else 6 return ((n % 10) + DigitSum(n / 10)); 7 } 8 9 int main() 10 { 11 printf("%d\n",DigitSum(1729)); 12 return 0; 13 }
5、整數n的數字根是如下定義的:它是一個整數的所有數字的和,反復相加,直到只剩下一位數字為止。例如:1729的digital root按照如下的步驟計算:
step 1: 1+7+2+9 -----> 19
step 2: 1+9 -----> 10
step 3: 1+0 ------> 1
因為第三步的結果是1,所以1就是數字根的值。
寫一個函數DigitalRoot(n),返回參數的根,注意:寫一個純粹的、不使用任何循環結構的遞歸函數。

1 int DigitSum(int n) 2 { 3 if(n < 10) 4 return n; 5 else 6 return ((n % 10) + DigitSum(n / 10)); 7 } 8 9 int DigitalRoot(int n) 10 { 11 if(n < 10) 12 return n; 13 else 14 return DigitalRoot(DigitSum(n)); 15 } 16 17 int main() 18 { 19 printf("%d\n",DigitalRoot(1729)); 20 return 0; 21 }
6、計算組合數C(n,k)

1 int Comb(int n, int k) 2 { 3 if(k == 0 || n == k) 4 return 1; 5 else 6 return (Comb(n - 1,k - 1) + Comb(n - 1,k)); 7 } 8 9 int main() 10 { 11 int i; 12 for(i = 0; i <= 6; i++) 13 { 14 printf("%d ",Comb(6,i)); 15 } 16 printf("\n"); 17 return 0; 18 }
7、將一個整數作為字符串打印

1 #include<stdio.h> 2 3 void printd(int n) 4 { 5 if(n < 0) { 6 putchar('-'); 7 n = -n; 8 } 9 if(n / 10) 10 printd(n / 10); 11 putchar(n % 10 + '0'); 12 } 13 14 int main() 15 { 16 int a = 12238; 17 printd(a); 18 printf("\n"); 19 return 0; 20 21 }
8、運用上面printd函數的設計思想編寫一個遞歸版本的itoa函數,即通過遞歸函數把整數變為字符串

1 #include<stdio.h> 2 3 void itoa(int n, char *s) 4 { 5 static int i; 6 if(n / 10) 7 itoa(n / 10, s); 8 else { 9 i = 0; 10 if(n < 0) 11 s[i++] = '-'; 12 } 13 s[i++] = abs(n) % 10 + '0'; 14 s[i] = '\0'; 15 } 16 17 int main() 18 { 19 char s[100]; 20 int n = 1232; 21 itoa(n, s); 22 printf("%s\n",s); 23 return 0; 24 25 }
9、編寫一個遞歸版本的reverse(s)函數,以將字符串s轉置

1 #include<stdio.h> 2 3 void reverser(char *s, int i, int len) 4 { 5 int c, j; 6 j = len - (i + 1); 7 if(i < j) { 8 c = s[i]; 9 s[i] = s[j]; 10 s[j] = c; 11 reverser(s, ++i, len); 12 } 13 } 14 15 void reverse(char *s) 16 { 17 int len; 18 len = strlen(s); 19 reverser(s, 0, len); 20 } 21 22 int main() 23 { 24 char s[100]; 25 gets(s); 26 reverse(s); 27 printf("%s\n",s); 28 return 0; 29 }