• C语言习题练习4--函数递归


    1.接受一个整型值(无符号),按照顺序打印它的每一位。

    1. #include
    2. void print(int n)
    3. {
    4. if (n > 9)
    5. {
    6. print(n/10);
    7. }
    8. printf("%d ", n % 10);
    9. }
    10. int main()
    11. {
    12. int num = 1234;
    13. print(num);
    14. return 0;
    15. }
    1. //递归法
    2. //1234----(123)+4---(12)+3--(1)+2
    3. void Print(unsigned int n)
    4. {
    5. if (n > 9)
    6. {
    7. Print(n/10);
    8. }
    9. printf("%d ", n % 10);
    10. }
    11. int main()
    12. {
    13. Print(1234);
    14. }

    2.编写函数创建临时变不允许量,求字符串的长度。

    1. #incude
    2. int Strlen(const char*str)
    3. {
    4. if(*str == '\0')
    5. return 0;
    6. else
    7. return 1+Strlen(str+1);//不包括\0
    8. }
    9. int main()
    10. {
    11. char *p = "abcdef";
    12. int len = Strlen(p);
    13. printf("%d\n", len);
    14. return 0;
    15. }
    1. int my_strlen(char* str)//传的是首地址
    2. {
    3. if (*str != '\0')
    4. return 1 + my_strlen(str + 1);
    5. else
    6. return 0;
    7. }
    8. int main()
    9. {
    10. char arr[] = "bit";
    11. //[b i t \0]
    12. //数组名其实是数组首元素的地址
    13. //
    14. int len = my_strlen(arr);
    15. printf("%d\n", len);
    16. return 0;
    17. }
    18. //my_strlen("bit")
    19. //my_strlen("it")+1
    20. //my_strlen("t")+1

    3.n的阶乘

    1. #define _CRT_SECURE_NO_WARNINGS
    2. #include
    3. int Fac(int n)
    4. {
    5. if (n <= 1)
    6. return 1;
    7. else
    8. return n * Fac(n - 1);
    9. }
    10. int main()
    11. {
    12. int n = 0;
    13. scanf("%d", &n);
    14. int ret = Fac(n);
    15. printf("%d\n", ret);
    16. return 0;
    17. }

    上述方法容易栈溢出,可以用循环

    1. int Fac(int n)
    2. {
    3. int i = 0;
    4. int ret = 1;
    5. for (i = 1; i <= n; i++)
    6. {
    7. ret *= i;
    8. }
    9. return ret;
    10. }
    11. int main()
    12. {
    13. int n = 0;
    14. scanf("%d", &n);
    15. int ret = Fac(n);
    16. printf("%d\n", ret);
    17. return 0;
    18. }

    4.斐波那契数列

    1. int count = 0;
    2. int Fib(int n)
    3. {
    4. if (n == 3)//统计第3个斐波那契数被计算的次数
    5. count++;
    6. if (n <= 2)
    7. return 1;
    8. else
    9. return Fib(n - 1) + Fib(n - 2);
    10. }
    11. int main()
    12. {
    13. int n = 0;
    14. scanf("%d", &n);
    15. //写一个函数求第n个斐波那契数
    16. int ret = Fib(n);
    17. printf("%d\n", ret);
    18. return 0;
    19. }
    1. //循环
    2. int Fib(int n)
    3. {
    4. int a = 1;
    5. int b = 1;
    6. int c = 1;
    7. while (n>2)
    8. {
    9. c = a + b;
    10. a = b;
    11. b = c;
    12. n--;
    13. }
    14. return c
    15. }
    16. int main()
    17. {
    18. int n = 0;
    19. scanf("%d", &n);
    20. //写一个函数求第n个斐波那契数
    21. int ret = Fib(n);
    22. printf("%d\n", ret);
    23. return 0;
    24. }

    5.递归实现n的k次方

    1. //编写一个函数实现n的k次方,使用递归实现
    2. double Pow(int n, int k)
    3. {
    4. if (k == 0)
    5. return 1.0;
    6. else if (k > 0)
    7. return n * Pow(n, k - 1);
    8. else
    9. return 1.0 / Pow(n, -k);
    10. }
    11. int main()
    12. {
    13. int n = 0;
    14. int k = 0;
    15. double ret = 0.0;
    16. scanf("%d %d", &n, &k);
    17. ret = Pow(n, k);
    18. printf("%lf\n", ret);
    19. return 0;
    20. }

    6.计算一个数的每位之和(递归实现)

    1. //写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
    2. int DigitSum(int n)
    3. {
    4. if (n > 9)
    5. return DigitSum(n / 10) + n % 10;
    6. else
    7. return n;
    8. }
    9. int main()
    10. {
    11. int n = 0;
    12. scanf("%d", &n);
    13. int sum = DigitSum(n);
    14. printf("%d\n", sum);
    15. return 0;
    16. }

     7.字符串逆序(递归实现)

    1. void reverse_string(char* str)
    2. {
    3. int l = 0;
    4. int r = strlen(str) - 1;
    5. while (l < r)
    6. {
    7. char tmp = *(str + l);
    8. *(str + l) = *(str + r);
    9. *(str + r) = tmp;
    10. l++;
    11. r--;
    12. }
    13. }
    14. int main()
    15. {
    16. char arr[] = "abcdef";//fedcba
    17. reverse_string(arr);//arr是数组名,数组名是数组首元素的地址
    18. printf("%s\n", arr);//fedcba
    19. return 0;
    20. }

    8.顺序打印

    1. //递归法
    2. //1234----(123)+4---(12)+3--(1)+2
    3. void Print(unsigned int n)
    4. {
    5. if (n > 9)
    6. {
    7. Print(n / 10);
    8. }
    9. printf("%d ", n % 10);
    10. }
    11. int main()
    12. {
    13. Print(1234);
    14. }

    9.小乐乐上课需要走n阶台阶,因为他腿比较长,所以每次可以选择走一阶或者走两阶,那么他一共有多少种走法? 

    1. #include
    2. int Fib(int n)
    3. {
    4. if (n <= 2)
    5. {
    6. return n;
    7. }
    8. else
    9. {
    10. return Fib(n - 1) + Fib(n - 2);
    11. }
    12. }
    13. int main()
    14. {
    15. int n = 0;
    16. scanf("%d", &n);
    17. int ret = Fib(n);
    18. printf("%d", ret);
    19. return 0;
    20. }

  • 相关阅读:
    win10环境下搭建QT+opencv
    MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
    第2章 docker镜像管理
    JavaScript原型&原型链到底是什么
    AcWing 3639.链表合并
    Java面向对象基础解析
    Docker入门概述
    CentOS下载
    作用域和作用域链
    本地连接服务器使用GPU训练模型
  • 原文地址:https://blog.csdn.net/m0_47017197/article/details/127711178