• 递归练习(C语言)


    本文地址:http://www.cnblogs.com/archimedes/p/recursive-practice.html,转载请注明源地址。

    1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。

    #include<stdio.h>
    int CannonBall(int h)
    {
        if(h == 1) return 1;
        else
            return CannonBall(h-1) + pow(h,2);
    }
    int main(void)
    {
        printf("%d
    ",CannonBall(4));
        return 0;
    }
    View Code

    2、使用C编写一个指数函数,实现n^k

    #include<stdio.h>
    int RaiseToPower(int n, int k)
    {
        if(k == 0)
            return 1;
        else
            return n * RaiseToPower(n,k -1);
    }
    
    int main()
    {
        printf("%d
    ",RaiseToPower(3,4));
        return 0;
    }
    View Code

    3、使用欧几里得公式写一个递归函数gcd(m,n),用来计算m与n的最大公约数.

    #include<stdio.h>
    int gcd(int m, int n)
    {
        if(m % n ==0)
            return n;
        else
            return gcd(n,m % n);
    }
    
    int main()
    {
        printf("%d
    ",gcd(18,4));
        return 0;
    }
    View Code

    4、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

    #include<stdio.h>
    int DigitSum(int n)
    {
        if(n < 10) 
            return n;
        else
            return ((n % 10) + DigitSum(n / 10));
    }
    
    int main()
    {
        printf("%d
    ",DigitSum(1729));
        return 0;
    }
    View Code

    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),返回参数的根,注意:写一个纯粹的、不使用任何循环结构的递归函数。

    #include<stdio.h>
    int DigitSum(int n)
    {
        if(n < 10) 
            return n;
        else
            return ((n % 10) + DigitSum(n / 10));
    }
    
    int DigitalRoot(int n)
    {
        if(n < 10)
            return n;
        else
            return DigitalRoot(DigitSum(n));
    }
    
    int main()
    {
        printf("%d
    ",DigitalRoot(1729));
        return 0;
    }
    View Code

    6、计算组合数C(n,k)

    #include<stdio.h>
    int Comb(int n, int k)
    {
        if(k == 0 || n == k) 
            return 1; 
        else
            return (Comb(n - 1,k - 1) + Comb(n - 1,k));
    }
    
    int main()
    {
        int i;
        for(i = 0; i <= 6; i++)
        {
            printf("%d ",Comb(6,i));
        }
        printf("
    ");
        return 0;
    }
    View Code

    7、将一个整数作为字符串打印

    #include<stdio.h>
    void printd(int n)
    {
        if(n < 0) {
            putchar('-');
            n = -n;
        }
        if(n / 10)
            printd(n / 10);
        putchar(n % 10 + '0');
    }
    
    int main()
    {
        int a = 12238;
        printd(a);
        printf("
    ");
        return 0;
    }
    View Code

    8、运用上面printd函数的设计思想编写一个递归版本的itoa函数,即通过递归函数把整数变为字符串

    #include<stdio.h>
    void itoa(int n, char *s)
    {
        static int i;
        if(n / 10)
            itoa(n / 10, s);
        else {
            i = 0;
            if(n < 0)
                s[i++] = '-';
        }
        s[i++] = abs(n) % 10 + '0';
        s[i] = '';
    }
    
    int main()
    {
        char s[100];
        int n = 1232;
        itoa(n, s);
        printf("%s
    ",s);
        return 0;
    }
    View Code

    9、编写一个递归版本的reverse(s)函数,以将字符串s转置

    #include<stdio.h>
    void reverser(char *s, int i, int len)
    {
        int c, j;
        j = len - (i + 1);
        if(i < j) {
            c = s[i];
            s[i] = s[j];
            s[j] = c;
            reverser(s, ++i, len);
        }
    }
    
    void reverse(char *s)
    {
        int len;
        len = strlen(s);
        reverser(s, 0, len);
    }
    
    int main()
    {
        char s[100];
        gets(s);
        reverse(s);
        printf("%s
    ",s);
        return 0;
    }
    View Code

    10、二分查找

    #include<stdio.h>
    #include<stdlib.h>
    #include<stdbool.h>
    
    int *binary_search(int val, int array[], int n)
    {
        int m = n / 2;
        if(n <= 0) return NULL;
        if(val == array[m]) return array + m;
        if(val < array[m]) return binary_search(val, array, m);
        else return binary_search(val, array + m + 1, n - m - 1);
    }
    
    int main()
    {
        int n;
        int *p;
        int a[6] = {1,2,3,4,5,6}; 
        while(~scanf("%d", &n)){
            p = binary_search(n, a, 6);
            if(p) {
                printf("this number is in the array at position %d
    ", p - a);
            } else {
                printf("this number is not in the array
    ");
            }
        }
        return 0;
    }   
    View Code
  • 相关阅读:
    HttpClient
    spring入门
    morphia进阶
    morphia基本API方法
    mangodb数据库框架morphia注解
    学与思
    解决vscode执行yarn启动项目报错
    使用swiper+动画实现轮播图自动播放
    vue中使用el-tree实现一行显示多条数据
    使用git命令提交部分修改代码
  • 原文地址:https://www.cnblogs.com/wuyudong/p/recursive-practice.html
Copyright © 2020-2023  润新知