函数(五)(函数的嵌套与递归调用)

2022-04-11 17:58:23 浏览数 (1)

函数的嵌套调用

C语言的函数定义是互相平行和独立的,但函数的调用是可以嵌套的,也就是说,在调用一个函数的过程中,又去调用另外一个函数。

例:编写程序,使用函数嵌套定义计算 1! 2! 3! … n!。

参考代码:

代码语言:javascript复制
#include <stdio.h>
    long fac(int n);
   long sum(int n);
    int main()
    {
        printf("1! 2! 3! = %ldn", sum());
        printf("1! 2! 3! 4! = %ldn", sum());
        printf("1! 2! 3! 4! 5! = %ldn", sum());
        return ;
   }
 /* fac函数计算n! */
   long fac(int n)
   {
       long f = ;
       int i;
       for(i=; i<=n; i  )
       {
           f = f * i;
       }
       return f;
   }
 /* sum求1!   2!   3!   …   n! */
   long sum(int n)
  {
       int i;
       long s = ;
      for(i=; i<=n; i  )
       {
          s = s   fac(i);  
       }
       return s;
   }

结果示例:

函数的递归调用

递归是指函数直接或间接的调用自己的过程。C语言的特点之一就是允许函数的递归调用,即在函数体中直接或间接的调用函数自身。如果一个函数直接调用了自己,称为直接递归;如果一个函数调用了其他函数,而被调用的函数又调用了主调函数,则称为间接递归。

递归调用的函数在定义时需要满足两个条件:

(1) 有一个或多个终止状态,即最简单的情况,用于结束递归调用。

(2) 每次递归调用都必须简化当前问题的求解,使问题越来越接近终止状态,最终达到终止状态。

特别强调,如果递归方法定义时没有恰当的满足上面两个条件,可能会造成无限递归,最终使内存资源耗尽而中止程序。

例:使用函数递归调用实现将一个正整数输出其二进制形式,例如,输入10,输出1010

思路分析:将十进制的正整数转换成其二进制形式输出,可以采用“除2取余,逆序排列”方法。具体方法是,用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位,后得到的余数作为二进制数的高位,依次排列起来。

参考代码:

代码语言:javascript复制
 #include <stdio.h>
  void dtob(int n);
  int main()
  {
      printf("10的二进制形式: ");
      dtob(10);
      printf("n");
      printf("100的二进制形式: ");
      dtob(100);
     printf("n");
     printf("255的二进制形式: ");
     dtob(255);
     printf("n");
       return 0;
   }

  void dtob(int n)
   {
       if(n/2 > 0)
       {
           dtob(n/2);
       }
       printf("%d", n%2);
   }

结果示例:

0 人点赞