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;…

vue2的v-model不更新

场景 动态生成组件时&#xff0c;动态为表单添加属性&#xff0c;同时使用v-model以数组形式访问表单属性。通过监听表单对象&#xff0c;发现并未实施更新。 原因 vue2无法监听数组索引一系列操作&#xff0c;从而不能及时响应。vue2是通过Object.definePropertys实现响应式的…

部署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;

十.pandas方法总结Numpy

目录 十.pandas方法总结 1.索引切片 2.数据排序 3.数据统计 Pandas数据计算 4.数据查看 5.数据清洗 6-数据分组 查看分组结果 7-处理第三方数据 csv文件操作 Excel文件操作 Excel文件读取read_excel Excel文件写入 to_excel() SQL操作 mysql读取 数据保存 pa…

Ubuntu 未能识别较新型号 Nvidia 显卡案例分析

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/03/unknown-nvidia-card-in-ubuntu/ &#xff09; 大家好&#xff0c;我是在淘宝“学习日记小店”做 Linux 服务的 learndiary。本文分享两个关于 Ubuntu 操作系统未能正确识别新型 NVIDIA 显卡型号…

代码随想录算法训练营第二十五天| LeetCode216. 组合III、LeetCode17.电话号码的字母组合

#LeetCode 216. Combination III #LeetCode 216. 视频讲解&#xff1a;和组合问题有啥区别&#xff1f;回溯算法如何剪枝&#xff1f;| LeetCode&#xff1a;216.组合总和III_哔哩哔哩_bilibili 如果做了77 题后&#xff0c;这个题目可以用相似的思路。回溯三部曲&#xff1a; …

c++和c语言的区别实例

C和C语言在程序设计领域内具有深远的影响&#xff0c;它们不仅丰富了编程的世界&#xff0c;也为软件开发人员提供了强大的工具。虽然C是在C语言的基础上发展起来的&#xff0c;但两者之间存在着一些关键的区别。为了更深入地理解这些不同&#xff0c;本文将从多个维度探讨C和C…

数据结构——双向链表(C语言版)

上一章&#xff1a;数据结构——单向链表&#xff08;C语言版&#xff09;-CSDN博客 目录 什么是双向链表&#xff1f; 双向链表的节点结构 双向链表的基本操作 完整的双向链表示例 总结 什么是双向链表&#xff1f; 双向链表是一种常见的数据结构&#xff0c;它由一系列节…

深度学习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;根据这些不同的条件用回溯法解决就好啦 解法 回溯…

#微信小程序:微信小程序常见的配置传值

微信小程序 app.js 设置全局的基础数据 通过 let app getApp() 获取里面的数据 app.json 设置tab,注册页面的路由 app.wxss 公共的样式&#xff0c;引入iconfont project.config.json 项目配置文件&#xff0c;用的最多就是配置是否开启https校验 pages 包含一个个…