当前位置:   article > 正文

C语言——函数递归

C语言——函数递归

1.概述

递归是一种解决问题的方法,在C语言中,就是自己调用自己

例如:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. printf("hello\n");
  5. main();
  6. return 0;
  7. }

但是,如果递归无限地进行下去,就会出现栈溢出,上述就是一个典型例子。

 1.1 递归的限制条件

并不是所有的递归都符合条件,上述的例子就不符合条件,递归有两个必要条件:

1.递归必须存在限制条件;

2.每次的递归结束之后,必须要越来越接近这个限制条件。

2.递归举例

2.1 求n的阶乘

题目:计算n的阶乘

分析:要实现n的阶乘,还要运用递归的方法,我们可以把n!转化为n! = n * (n - 1 )!

代码实现如下:

  1. int Fact(int n)
  2. {
  3. if (n == 0)
  4. return 1;
  5. else
  6. return n * Fact(n - 1);
  7. }
  8. int main()
  9. {
  10. int n = 0;
  11. scanf("%d", &n);
  12. int r = Fact(n);
  13. printf("%d\n", r);
  14. return 0;
  15. }

从上述的代码中,我们可以看出,递归就是用少量的代码完成了大量的运算。 

2.2 顺序打印一个整数的每一位

题目:输入一个数据,按照顺序打印整数的每一位

比如:输入:1234     输出: 1 2 3 4

代码实现如下:

  1. void Print(int n)
  2. {
  3. if (n > 9)
  4. Print(n / 10);
  5. printf("%d ", n % 10);
  6. }
  7. int main()
  8. {
  9. int n = 0;
  10. scanf("%d", &n);
  11. Print(n);
  12. return 0;
  13. }

 3.递归与迭代

递归的方法是一种很好的编程技巧,但是并不是在任何时候,递归的方法都适用,因此,在使用递归的方法之前还要慎重考虑!

C语言中每一次函数的调用,都需要为本次函数调用在内存中的栈区,申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时栈帧,或者函数栈帧。

如果再函数递归时,递归的层次太深,就会浪费太多的栈帧空间,也可能会出现栈溢出的现象。

如果不用递归的方式,通常我们会采用迭代的方式(循环的方式)。

例如上述求n的阶乘的问题:

  1. int Fact(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 r = Fact(n);
  16. printf("%d\n", r);
  17. return 0;
  18. }

3.1 求n个斐波那契数

斐波那契数列:当n>=3时,在任意一个位置的数,等于前两个数的和,如:1  1  2  3  5...

如果我们考虑用递归的方法,则代码实现如下:

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

上述代码看起来是正确的,当然当n的值比较小的时候,结果很快就可以得出来,但是,当n的值很大的时候,我们就会发现结果运行很慢。这就要考虑上述所说到的栈溢出的现象。

在这种情况下,就属于递归方法的错误使用,因此,我们要考虑使用迭代的方法进行解决,解决方法如下所示:

  1. int Fib(int n)
  2. {
  3. int a = 0;
  4. int b = 0;
  5. int c = 0;
  6. if (n <= 2)
  7. return 1;
  8. else
  9. {
  10. a = 1;
  11. b = 1;
  12. for (int i = 3; i <= n; i++)
  13. {
  14. c = a + b;
  15. a = b;
  16. b = c;
  17. }
  18. return c;
  19. }
  20. }
  21. int main()
  22. {
  23. int n = 0;
  24. scanf("%d", &n);
  25. int r = Fib(n);
  26. printf("%d\n", r);
  27. return 0;
  28. }

总结:递归可以简便运算的思路,但是,有些看似可以运用递归的问题,实际上是不可以的,因此,在运用递归的方法时,我们要慎重!

今天就到这里,我们下一个知识点再见~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/1016527
推荐阅读
相关标签
  

闽ICP备14008679号