C语言函数递归

一、什么是递归

递归实际上就是函数自己调用自己。

递归在书写的时候,有2个必要条件:
• 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
• 每次递归调用之后越来越接近这个限制条件。
在下面的例子中,我们逐步体会这2个限制条件。

二、递归举例

2.1求n的阶乘

我们都知道n!=n*(n-1)!,如此递归下去,我们就可以写出代码。

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

我们首先会想,怎么打印出来这个数的每一位,如果输入一个数n,n是一位数的话,那么打印出来就是他本身,如果n是1234的话,我们要按打印出来1 2 3 4,1234%10就能得到4,之后1234/10,相当于去掉了4,以此类推,但是这些数是倒着的。

        但是我们有了灵感,我们发现其实⼀个数字的最低位是最容易得到的,通过%10就能得到
那我们假设想写一个函数Print来打印n的每一位。

在这个解题的过程中,我们就是使用了大事化小的思路
把Print(1234)打印1234每一位,拆解为首先Print(123)打印123的每⼀位,再打印得到的4
把Print(123)打印123每一位,拆解为首先Print(12)打印12的每一,再打印得到的3
直到Print打印的是一位数,直接打印就行。

三、递归与迭代

        如举例1fact函数是可以产生正确的结果,但是在递归函数调用的过程中涉及一些运行时的开销。在C语言中每一次函数调用,都要需要为本次函数调用在栈区申请一块内存空间来保存函数调用期间的各种局部变量的值,这块空间被称为运行时堆栈,或者函数栈帧。
        函数不返回,函数对应的栈帧空间就一直占用,所以如果函数调用中存在递归调用的话,每一次递归函数调用都会开辟属于自己的栈帧空间,直到函数递归不再继续,开始回归,才逐层释放栈帧空间。
        所以如果采用函数递归的方式完成代码,递归层次太深,就会浪费太多的栈帧空间,也可能引起栈溢出的问题。

        所以如果不想使用递归就得想其他的办法,通常就是迭代的方式(通常就是循环的方式)。
比如:计算n的阶乘,也是可以产生1~n的数字累计乘在一起的。

上述代码是能够完成任务,并且效率是比递归的方式更好的。
事实上,我们看到的许多问题是以递归的形式进行解释的,这只是因为它比非递归的形式更加清晰,但是这些问题的迭代实现往往比递归实现效率更⾼。
当一个问题非常复杂,难以使用迭代的方式实现时,此时递归实现的简洁性便可以补偿它所带来的运行时开销。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将一个 PostgreSQL 数据库复制到另一个数据库中

以管理员身份进入cmd窗口,输入如下命令 语法: pg_dump -C -h 本机IP -U 本机postgresql用户名 源数据库名 | psql -h 服务器IP -U 服务器postgresql用户名 目标数据库名 示例: pg_dump -C -h 127.0.0.1 -U postgres test01-dbname | psql…

leetcode:1925. 统计平方和三元组的数目(python3解法)

难度&#xff1a;简单 一个 平方和三元组 (a,b,c) 指的是满足 a2 b2 c2 的 整数 三元组 a&#xff0c;b 和 c 。 给你一个整数 n &#xff0c;请你返回满足 1 < a, b, c < n 的 平方和三元组 的数目。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;2 解释…

AI绘画丨精美3D立体插图

利用衍纸艺术制作的3D立体精美插图&#xff0c;以星星作为主题&#xff0c;错落在整个画面中&#xff0c;一起看看他的生成关键词吧~ 使用关键词&#xff1a;A gorgeous multi-dimensional paper illustration, paper quilling, 3D diorama of a vintage stargazing illustrat…

JSON:简介与基本使用

目录 什么是JSON&#xff1f; JSON的基本结构 JSON的基本使用 在JavaScript中使用JSON 创建JSON对象 解析JSON字符串 生成JSON字符串 在其他编程语言中使用JSON 总结 什么是JSON&#xff1f; JSON&#xff0c;全称为JavaScript Object Notation&#xff0c;是一种轻量…

NCDA视觉传达设计大赛终极攻略:助你斩获佳绩

第十二届全国高校未来设计师数字艺术设计大赛&#xff08;NCDA&#xff09; A类&#xff1a;视觉传达设计 参赛对象&#xff1a; 大学生小组&#xff1a;分①研究生组②本科生组③专科生组&#xff0c;三组分别进行评审 教师小组&#xff1a;普通高校教师&#xff0c;不分小…

解除网页复制限制

chrome 中右击点检查&#xff0c; 找到要复制的文字块 把如图所示右边的 copy里的事件全部remove 然后就可以右击复制了

043 多态

示例 public class A {public void say(){System.out.println("I am A");} } public class B extends A {Overridepublic void say(){System.out.println("I am B");} } public class Test {public static void main(String[] args) {A a new B(); // …

项目管理基本要素--项目、项目集、项目组合

本文描述从事项目管理和了解项目管理领域所需的基本要素&#xff0c;词汇定义来自于《项目知识管理体系》(PMBOK指南)第六版&#xff0c;仅作个人学习使用&#xff0c;任何对此文章的引用&#xff0c;应当说明源出处&#xff0c;不得用于商业用途。 如有侵权、联系速删 文章目录…

项目管理工具git

git 1. git介绍1.1. 版本控制系统 2. 创建本地版本库2.1 概念2.2 操作步骤 3. 修改文件4. 练习: 添加一个本地项目到仓库5. 添加远程仓库5.1 添加远程仓库5.2 本地仓库同步到远程仓库5.3 克隆远程仓库到本地5.4 SSH设置 6. 分支管理6.1 创建分支6.2 切换分支6.3 合并分支6.4 解…

猫头虎分享已解决Bug || ValueError: No gradients provided for any variable

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引&#xff1f; 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎&#xff0c;两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别&#xff1f; 7、IN与EXISTS的区别 二、索引 1、索引及索…

操作系统系列学习——操作系统启动

文章目录 前言操作系统启动 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工大…

亚信安慧AntDB:数据处理的好帮手

亚信安慧AntDB分布式数据库凭借平滑扩展、高可用性和低成本三大核心优势&#xff0c;在业界获得了极高的评价和认可。这些优点不仅为AntDB提供了巨大的市场发展潜力&#xff0c;也使其成为众多企业在数据管理上的首选解决方案。 AntDB的平滑扩展特性极大地提升了企业的灵活性和…

基于51单片机的智能监护与健康检测[proteus仿真]

基于51单片机的自行车测速系统设计[proteus仿真] 个人健康检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于51单片机的智能监护与健康检测 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xff…

系统找不到xinput1_3.dll怎么办?试试这五种解决方法轻松搞定

在计算机系统运行过程中&#xff0c;当我们遭遇“找不到xinput1_3.dll”这一错误提示时&#xff0c;实际上正面临一个软件兼容性、系统组件缺失以及游戏或应用程序无法正常启动的关键问题。深入探究这一现象&#xff0c;我们会发现它可能引发一系列连带问题&#xff0c;例如某些…

LLM推理入门指南①:文本生成的初始化与解码阶段

随着生成式AI的火热发展&#xff0c;高企的语言大模型&#xff08;LLM&#xff09;推理性能和成本成为阻碍其大规模应用的关键挑战。 LLM推理是指使用仅解码器Transformer模型生成词元&#xff0c;而大多数挑战及其相关的解决方法都来自这种特定的架构和用例。本系列文章将深入…

邮件营销神器Focussend,轻松实现1美元转化72美元的营销高回报!

随着社交媒体营销逐渐成为主流&#xff0c;一家名为Focussend的公司却在邮件营销领域崭露头角。成立于2009年&#xff0c;Focussend经过尝试综合营销后&#xff0c;选择进入古早但高回报的邮件营销市场。目前&#xff0c;该公司在跨境平台中排名靠前&#xff0c;服务着上万名中…

c入门第二十三篇: 学生成绩管理系统优化(支持远程操作)

前言 师弟高兴的说道&#xff1a;“师兄&#xff0c;你猜我今天上课看见谁了&#xff1f;” 我&#xff1a;“谁呢&#xff1f;” 师弟&#xff1a;“程夏&#xff0c;没想到&#xff0c;她竟然来旁听我们计算机系的课程了。虽然我从前门进去的&#xff0c;但是我还是一眼就看…

【力扣白嫖日记】178.分数排名

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 178.分数排名 表&#xff1a;Scores 列名类型idintscoredecimal 在 SQL 中&#xff0c;id 是该表的主键。 …