C语言学习-day22-函数递归1

程序调用自身的编程技巧被称为递归。举个例子:

int main()

{

    printf("hehe\n");

    main();

    return 0;

}

比如这种,自己调用自己后每次都打印一个hehe。

递归的核心思考方式在于:大事化小。

做个练习:接收一个整型值(无符号),按照顺序打印它的每一位。例如:输入1234,输出1 2 3 4.

没有递归的策略是做一个循环把这个数先除10再模10然后存一下进入下一个循环判断剩余数是除10是否为0。

1234%10=4

1234/10=123%10=3

123/10=12%10=2

12/10=1%10=1

1/10=0

用递归的方法:

void print(unsigned int n)//返回值类型设置为void因为不需要返回,我直接用print打印到屏幕即可。参数类型跟main函数里的num一样。

{

    if (n > 9)

    {

         print(n / 10);

    }

    printf("%d\n", n % 10);

}

int main()

{

    unsigned int num = 0;

    scanf("%u", &num);//比如1234

    //递归-函数自己调用自己

    print(num);//print函数打印参数部分数字的每一位。

    return 0;

见print函数里,我们需要依次执行1234%10 123%10 12%10 1%10并且依次打印。所以函数里要做的是把参数n模10打印然后除以10递归到下一个print函数里.执行一下这个代码试试:

递归两个必要条件:

  1. 递归必须存在限制条件,当满足这个限制条件,递归不再继续。
  2. 每次递归越来越接近这个限制条件。

这两个是必要条件,不是充分,如下代码:

void test(int n)

{

    if (n < 10000)

    {

         test(n+1);

    }

   

}

int main()

{

    test(1);

    return 0;

}

执行后报错,提示如下。

解释栈溢出(stack overflow):

内存分为

  1. 栈区:局部变量、函数形参
  2. 堆区:动态内存分配
  3. 静态区:全局变量、静态变量

每一个函数调用都需要在栈区分配一块空间,比如调用main函数,分配一块给main函数,这块空间较main函数栈帧空间。当函数递归时候,每一次test都要调用空间,比如test1000,test999每一个调用的时候上一个函数都没有结束所以上一次函数的空间还没有清除,如果递归太深,会导致内存的栈区被用光,产生上述的情况栈溢出。

所以写递归代码的时候:

  1. 不能死递归,有跳出条件,每次递归逼近跳出条件。
  2. 递归层次不能太深

网站:StackOverflow:程序员的知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS-类型定义

说明&#xff1a; 本模块首批接口从API version 7开始支持&#xff0c;后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 Resource 资源引用类型&#xff0c;用于设置组件属性的值。 可以通过$r或者$rawfile创建Resource类型对象&#xff0c;不可以修改Res…

【S056】Clause46--XGMII接口摘要

文章目录 XGMII数据与lane的对应关系是什么&#xff1f;XGMII上的数据流格式是什么&#xff1f;如何保证0xFB每次都在Lane0&#xff1f;方法一&#xff1a;方法二&#xff1a; Link Fault信号 XGMII数据与lane的对应关系是什么&#xff1f; XGMII上的数据流格式是什么&#xff…

GDC期间LayaAir启动全球化战略

3 月 18 日至 3 月 22 日&#xff0c;一年一度的游戏开发者大会&#xff08;GDC&#xff09;在美国旧金山举行。在此期间&#xff0c;Layabox宣布LayaAir引擎启动全球扩张战略&#xff0c;这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术&#xff0c;将…

Linux之git

一、什么叫做版本控制 版本控制&#xff08;Revision control&#xff09;是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史&#xff0c;方便查看更改历史记录&#xff0c;备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发项目的技…

Affiliate Stores: 建立营销联盟商店的详细教程- US Domain Center主机

第一步&#xff1a;了解营销联盟商店 营销联盟商店是一种电子商务模式&#xff0c;您可以在其中通过推广其他企业的产品或服务来赚取佣金。您在自己的网站上展示其他企业的产品&#xff0c;并在买家购买时获得佣金。通过 WooCommerce 平台&#xff0c;您可以轻松创建一个营销联…

学习总结!

java目前学习到了数组部分 广搜&#xff0c;在开始的时候把#处理一下会好做很多&#xff0c;遇到上下两层都是# 的&#xff0c;就把上下两层的这个位置都弄成墙就行。还有遇到 一层是#&#xff0c;一层是墙的。也直接把俩都弄城墙就行&#xff0c;省的要判断他撞死&#xff0c;…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

【JavaScript】JavaScript 程序流程控制 ⑤ ( 嵌套 for 循环 | 嵌套 for 循环概念 | 嵌套 for 循环语法结构 )

文章目录 一、嵌套 for 循环1、嵌套 for 循环概念2、嵌套 for 循环语法结构 二、嵌套 for 循环案例1、打印三角形2、打印乘法表 一、嵌套 for 循环 1、嵌套 for 循环概念 嵌套 for 循环 是一个 嵌套的 循环结构 , 其中一个 for 循环 位于另一个 for 循环的内部 , 分别是 外层 f…

计算机网络实验——学习记录二(HTTP协议)

1. Linux主机上连接互联网的网络接口是&#xff1a;ens33。 2. 在显示过滤器&#xff08;Filter&#xff09;中输入“ http.host www.zzu.edu.cn”&#xff0c;筛选出HTTP协议报文首部行中包含“ Host&#xff1a;www.zzu.edu.cn”的报文&#xff08;目的地址是Web服务器的报…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01;

深度学习pytorch——可视化visdom(持续更新)

安装可看&#xff1a;e: Error while finding module specification for ‘visdom.server‘ (ModuleNotFoundError: No module name-CSDN博客 在命令行窗口使用python -m visdom.server&#xff0c;会出现一个web地址&#xff0c;在浏览器中访问&#xff0c;即可看见在python中…

springboot做自定义校验注解

目录 自定义校验注解的实现 注意&#xff1a; 首先&#xff0c;我们需要自定义一个校验注解&#xff1a; 注解含义&#xff1a; Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Constraint(validatedBy PhoneValidator.class) 校验注解逻辑实现类&a…

算法打卡day24|回溯法篇04|Leetcode 93.复原IP地址、78.子集、90.子集II

算法题 Leetcode 93.复原IP地址 题目链接:93.复原IP地址 大佬视频讲解&#xff1a;复原IP地址视频讲解 个人思路 这道题和昨天的分割回文串有点类似&#xff0c;但这里是限制了只能分割3次以及分割块的数字大小&#xff0c;根据这些不同的条件用回溯法解决就好啦 解法 回溯…

2024最新版正规视频影视系统源码/APP+H5视频影视源码

全新魅思V20正规视频影视系统源码&#xff0c;APPH5视频影视源码。会员花费三千购入的&#xff0c;具体搭建教程放压缩包了&#xff01; 有兴趣的下载自行研究吧&#xff0c;搭建一共要用到3个域名&#xff0c;可以拿二级域名搭建。

C语⾔内存函数

目录 1. memcpy使⽤和模拟实现 memcpy函数的模拟实现: 2. memmove使⽤和模拟实现 memmove的模拟实现&#xff1a; 3. memset函数的使⽤ 4. memcmp函数的使⽤ 1. memcpy使⽤和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数me…

Python文件读写操作

文件操作注意点 注意点&#xff1a; 1. for line in file --> 会将偏移量移到末尾 2. buffering1 --> 缓冲区中遇到换行就刷新&#xff0c;即向磁盘中写入 3. 读操作结束后&#xff0c;文本偏移量就会移动到读操作结束位置 """编写一个程序,循环不停的写入…

简述C语言文件操作

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;魔法指针&#xff0c;进阶C&#xff0c;C语言&#xff0c;C语言题集&#xff0c;C语言实现游戏&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分79)&#xff0c;分享…

图论基础|841.钥匙和房间、463. 岛屿的周长

目录 841.钥匙和房间 思路&#xff1a;本题是一个有向图搜索全路径的问题。 只能用深搜&#xff08;DFS&#xff09;或者广搜&#xff08;BFS&#xff09;来搜。 463. 岛屿的周长 841.钥匙和房间 力扣题目链接 (opens new window) 有 N 个房间&#xff0c;开始时你位于 0…

概率论与数理统计-条件概率题目1-两次取球问题(有放回)

题目&#xff1a; 设袋中装有r只红球,t只白球.每次自袋中任取一只球,观察其颜色例3然后放回,并再放入a只与所取出的那只球同色的球.若在袋中连续取球四次&#xff0c;试求第一、二次取到红球且第三、四次取到白球的概率. 解答&#xff1a; 涉及到条件概率和多次独立事件的概…

ColorWell for Mac 直装激活 非常实用的调色工具

ColorWell 是一款为Mac操作系统设计的实用工具&#xff0c;它旨在帮助用户快速而方便地选择、管理和应用颜色。这款应用程序特别适合设计师、插画师、网页开发者以及任何需要精确颜色匹配的专业人士使用。ColorWell 的核心功能是提供一个简单直观的界面&#xff0c;让用户可以轻…