前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >函数(五)(函数的嵌套与递归调用)

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

作者头像
pigeon
发布于 2022-04-11 09:58:23
发布于 2022-04-11 09:58:23
1.6K00
代码可运行
举报
文章被收录于专栏:电子荣耀电子荣耀
运行总次数:0
代码可运行

函数的嵌套调用

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

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

参考代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
    long fac(int n);
   long sum(int n);
    int main()
    {
        printf("1!+2!+3! = %ld\n", sum());
        printf("1!+2!+3!+4! = %ld\n", sum());
        printf("1!+2!+3!+4!+5! = %ld\n", 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
代码运行次数:0
运行
AI代码解释
复制
 #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);
   }

结果示例:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子荣耀 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python基础之函数嵌套调用
  实际开发过程中,经常会遇到很多完全相同或者非常相似的操作,这时,可以将实现类似操作的代码封装为函数,然后在需要的地方调用该函数。这样不仅可以实现代码的复用,还可以使代码更有条理性,增加代码的可靠性。下面我们来介绍一下python的函数嵌套调用相关内容。
jiankang666
2022/12/05
5500
python基础之函数嵌套调用
C语言函数嵌套与递归调用-学习十八
本文最后更新于2022年02月12日,已超过16天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
XG.孤梦
2022/03/01
1.7K0
C语言函数嵌套与递归调用-学习十八
递归调用
一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。 递归必须是有推出条件的,如果没有,将会一直递下去,没有归。造成内存溢出崩溃。 先写一个简单的递归函数
用户7272142
2023/10/11
1910
递归调用
【c语言】运算符汇总(万字解析)
为了促进大家深入理解C语言并提升学习效率,本博客作者将对C语言中常用运算符的功能及其使用方法进行全面梳理,同时整合归纳这些运算符的优先级、结合性以及表达式求值规则。
ephemerals__
2024/10/30
7250
【c语言】运算符汇总(万字解析)
详解操作符(超详细)
介绍一部分,操作符中有一些操作符和二进制的关系,我们先铺垫一下二进制和进制转换的知识。
用户11036582
2024/03/21
1290
详解操作符(超详细)
函数(2)
再举一个简单的例子:假设有一位程序员写了一个能够求两数相加之和的函数,他想卖给别人使用,但又不想让别人看到他的源代码,他应该怎么做呢?
waves浪游
2024/01/23
1680
函数(2)
C++ 函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归(recursive)调用。包含递归调用的函数称为递归函数。 比如:
chaibubble
2022/05/07
1.2K0
C++ 函数的递归调用
函数的递归调用(零基础理解递归)
递归是c语言学习中一个绕不开的话题, 那什么是递归呢? 递归其实就是一种解决问题的方法, 在c语言中, 递归就是函数自己调自己. 写一个史上最简单的C语言递归代码:
用户11317877
2024/10/16
1100
函数的递归调用(零基础理解递归)
C语言常见的进制转换
生活中最常见的进制是十进制,而有一类编程题会要求将十进制转换为其他进制,本篇博客将主要讲述C语言中常见的几类进制转换问题。
用户10923276
2024/03/28
1450
C语言常见的进制转换
[C语言]C语言基础知识概述
进制就是进位制,是人们规定的一种进位方法。对于任何一种进制—X进制就表示某一位置上的数运算时是逢X进一位。十进制就是逢十进一,十六进制是逢十六进一,二进制是逢二进一。
IT编程爱好者
2023/04/12
9650
[C语言]C语言基础知识概述
什么是递归函数?[通俗易懂]
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。 当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,结束条件与递推关系
全栈程序员站长
2022/10/01
1.1K0
什么是递归函数?[通俗易懂]
C语言编写程序把输入的十进制长整数型数以十六进制的形式输出
对于整数部分,用被除数反复除以16,除第一次外,每次除以16均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。
岳泽以
2022/10/26
7090
c语言基础学习06_函数
============================================================================= 涉及到的知识点有:1、C语言库函数、字符输入函数:gets和fgets、字符输出函数:puts和fputs、 求字符串长度函数strlen、字符串追加函数strcat、字符串有限追加函数strncat、字符串比较函数strcmp、 字符串有限比较函数strcmp、字符串拷贝函数strcpy、字符串有限拷贝函数strncpy、 格式化字符串函数sprintf(输出)、格式化字符串函数sscanf(读取输入)、解析一个字符串、 字符串查找字符函数strchr、字符串查找子串函数strstr、字符串分割函数strtok、 atoi函数、atof函数、atol函数、解析一个字符串的高级应用。 2、函数的定义和声明、函数的形式参数(形参)与实际参数(实参)、函数的返回值类型和返回值、 return函数与exit函数(exit更猛,不受位置限制)、自定义一个函数,实现大小写字母的互相转换功能、 自定义一个函数,实现atoi的功能。 3、函数的递归、递归例子:有n个人排成一队、递归例子:将10进制数转化为二进制数、 递归例子:将10进制数转化为16进制、递归例子:菲波那切数列、递归的优点与缺点。 4、多个源代码文件程序如何编译、头文件的使用、解决预编译时会出现多次函数声明问题。 ============================================================================= C语言库函数
黑泽君
2018/10/11
1.3K0
我整理了10个非常基础的c语言循环结构和选择结构的小题目,看看你的基础够不够牢固。
译密码。为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。
大熊G
2022/11/14
9000
我整理了10个非常基础的c语言循环结构和选择结构的小题目,看看你的基础够不够牢固。
未禾的C语言总结
**************************************************************************************************************************************************************************************************************** 操作符解释:     1,算术操作符:         ‘+’、‘-’、‘*’、‘/’、‘%’         %取模操作符只能用于整数,         /除法操作符,两个操作数均是整数时为整数除法,有一个是浮点数则执行浮点数除法。         如:int a = 6/5;//->a==1             double b = 6/5;//->b==1.000000             double c = 6.0/5//->c==1.200000,即实际运算与定义的储存类型无关     2,移位操作符         左移‘<<’、右移‘>>’         左移操作符:             如:   int a=2;                 int b = a << 1;//a向左移动一位,结果存入变量b中,结果b为4             正整数2在内存中存放的补码为:                                00000000000000000000000000000010             向左移动一位,左边的首位0去掉,右边的缺一位补0:00000000000000000000000000000100 ->4(十进制)         右移操作符:             右移时分为算数右移和逻辑右移。             算数右移:右边丢弃,左边补符号位。             逻辑右移:右边丢弃,左边补0。             如:int a = -10;                    int b = a >> 1;//a向右移动一位,结果存入变量b中             正整数10在内存中的补码为11111111111111111111111111110110//若为负数则原码与补码不同。             算术右移:             11111111111111111111111111111011 ->-5             逻辑右移:             01111111111111111111111111111011 ->2,147,483,643         对移位操作符移动负数位,这时C语言未定义的,不要使用。     3,位操作符         按位与‘&’、按位或‘|’、按位异或‘^’         位解释为二进制的一位。         &按位与,全为1时结果才为1,其他情况结果均为0             如:int a = 3;//        00000000000000000000000000000011                    int b = 5;//        00000000000000000000000000000101                    int c = a & b;//    00000000000000000000000000000001->1(十进制)             eg:找出一个整数的二进制的1的个数。                 #include <stdio.h>                 int main(){                 int a=1;                 int cnt=0;                 for(int i=0; i<31; i++){                     if((a&1) == 1){//整数的二进制数的1的个数                          cnt++;                     }                     a=a >> 1;                 }                 printf("%d\n",cnt);                 return 0;             }          |按位或,全为0时结果才为0,其他情况结果均为1             如:int a = 3;//    000
怠惰的未禾
2023/04/27
5170
Java方法的嵌套与递归调用
方法嵌套的概念其实比较好理解,就是在调用方法的过程中又遇到了方法的调用,在刚开始接触的时候虽然在逻辑上能够理解为什么运行结果是这样的,但是对于代码执行的过程还是感觉有些绕。
一头小山猪
2020/04/08
2.5K0
Java方法的嵌套与递归调用
【C#学习笔记03】进制转换与反码、补码、原码
计算机中的数据通常以二进制形式存储,但在编程和调试过程中,我们经常需要与十进制、八进制和十六进制打交道。因此,掌握进制转换是C语言学习中的重要一环。
一条晒干的咸鱼
2025/03/12
830
【C#学习笔记03】进制转换与反码、补码、原码
递归函数及例题_递归树求解递归式例题
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说递归函数及例题_递归树求解递归式例题,希望能够帮助大家进步!!!
Java架构师必看
2022/07/19
6810
递归函数及例题_递归树求解递归式例题
【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换
同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来进制的定义:从右往左一次用各位上的数字乘以这个进制的n次方(n为从右往左以0为首依次++的数字)
s-little-monster
2024/06/06
1160
【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换
【C语言】基本语法知识&&C语言函数&&操作符详解
首先介绍一下我使用的工具:VS2019——集成了很多的功能:编辑、编译、链接、运行、调试等
用户10925563
2024/06/04
2890
【C语言】基本语法知识&&C语言函数&&操作符详解
相关推荐
python基础之函数嵌套调用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文