C語言遞歸練習


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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

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 }
C代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM