C语言函数递归调用

news/2024/5/11 1:56:52/文章来源:https://blog.csdn.net/qq_48516121/article/details/126902748

1、函数递归调用的定义

递归函数定义:一个函数在 自己的函数体内 调用自己;执行递归函数将反复调用其自身,每调用一次就有一个新层

#include<stdio.h>
// 函数声明
void diguifunc();
int main()  //主函数
{diguifunc();   //运行后程序会崩溃,资源耗尽了
}
// 递归函数的定义
void diguifunc()
{int tempvar1 = 150;  //局部变量:在函数内部定义的变量,当函数整个执行完毕后,局部变量所占的内存会被系统自动回收,回收后该局部变量就不可以再使用了。printf("diguifunc函数执行-----\n");diguifunc();
}
// 调用栈(一块系统分配给咱们这个程序有特殊用途的内存):就是把形式参数,函数调用关系,局部变量等进行保存在栈里面。
这段内存是有限的,如果一旦超过这个内存大小,就会出现崩溃现象。

函数递归调用运行图:

2、递归调用的出口

因为上面这种递归调用会产生死循环,所以这种自己调用自己的方式必须要有一个出口,这个出口也叫做递归结束条件,从而能够让这种函数调用结束。

范例:计算5的阶乘,其实就是计算 1*2*3*4*5,

我们并不知道5的阶乘是多少,但是我们知道一点,4的阶乘 * 5他就等于5的阶乘。

我们并不知道4的阶乘是多少,但是我们知道一点,3的阶乘 * 4他就等于4的阶乘。

我们并不知道3的阶乘是多少,但是我们知道一点,2的阶乘 * 3他就等于3的阶乘。

所以递归调用的出口肯定是在1的阶乘,因为1的阶乘是1,可以作为出口,我们能够求出2的阶乘,也就是1*2;以此类推瑞。

#include<stdio.h>
// 函数声明
int dg_jiecheng(int n);int main()  //主函数
{int result = dg_jiecheng(5);printf("result=%d\n",result);  // 结果为120
}
// 函数定义
int dg_jiecheng(int n)
{int result;  // 局部变量,保存阶乘结果if(n==1) // 1的阶乘就是1{return 1;  // 这里就是该递归调用的出口}else{// 第一次是 result = dg_jiecheng(4)*5,然后进入到了 dg_jiecheng(4),这行代码就被暂存了;第二次是 result = dg_jiecheng(3)*4,然后进入到了 dg_jiecheng(3),这行代码就被暂存了;第三次是 result = dg_jiecheng(2)*3,然后进入到了 dg_jiecheng(2),这行代码就被暂存了;第四次是 result = dg_jiecheng(1)*2,然后进入到了 dg_jiecheng(1),这行代码就被暂存了;此时,dg_jiecheng(1)的出口条件成立了,终于,能够执行return 1,这可是 return 语句第一次捞着执行。第一次:return 1,返回的是1,返回到dg_jiecheng(2)这里:return =1*2 并且也执行return result;,返回1*2=2;
返回到dg_jiecheng(3)这里:return =2 并且也执行return result;,返回2*3=6;
返回到dg_jiecheng(4)这里:return =6 并且也执行return result;,返回6*4=24;
返回到dg_jiecheng(5)这里:return =24 并且也执行return result;,返回24*5=120;result = dg_jiecheng(n-1)* n;}return result;
}

3、递归的优缺点

优点:

        代码少,代码看起来简洁,精妙。

缺点:

        虽然代码简洁,精妙,但是不好理解。

         如果调用的层次太深,调用栈(内存),可能会溢出,如果真出现这种情况,那么说明不能用递归解决该问题。

        效率和性能都不高,这深层次的调用,要保存的东西很多,所以效率和性能肯定高不起来。有些问题用不用递归都行,有些问题可能必须用递归解决。汉诺塔

         递归函数的直接和间接调用:

递归函数的直接调用:调用递归函数f的过程中,f函数有调用自己,这就是直接调用。

递归函数的间接调用:调用函数f1的过程中要调用f2函数,然后f2函数又调用f1函数,这就是间接调用。

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

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

相关文章

常用的软件架构

MVC 架构 MVP 架构 MVVM 架构 网上的一些常用架构解释图:MVC架构MVP架构

Haproxy 透传IP配置方法及测试

Haproxy 透传IP配置方法1. 环境准备2. 测试准备2.1 启动Haproxy容器方法2.1.1 拉取官方haproxy镜像2.1.2 删除旧的容器2.1.3 编写haproxy配置2.1.4 运行配置检查2.1.5 启动容器2.1.6 更改配置2.2 Golang Server编写2.2.1 TCP Server2.2.2 HTTP Server2.3 客户端测试2.3.1 设置网…

关于VC++运行库报错

Microsoft Visual C&#xff08;简称Visual C、MSVC、VC或VC&#xff09;是微软公司的C开发工具&#xff0c;具有一体化开发环境&#xff0c;可提供编辑 C语言&#xff0c;C以及C/CLI等程式语言。 VC集成了便利的调试工具&#xff0c;特别是整合了微软Windows窗口操作系统应用程…

家用网络常识

目前家庭使用的网速一般 运营商 销售的宽带,会说 50M 100M 200M 300M 这个 100M 指的就是 100M bit/s,而我们都知道 8bit相当于一个字节,也就是1B,所以换算成字节,其实是 12.5M B/s,也就是12.5M,12.5兆换算关系 1 KB = 1024 B 1 MB = 1024 KB 1 GB = 1024 MB 1 TB = 102…

联邦学习开源框架方案选型

无知者&#xff1a;【联邦学习开源框架】FedLab - 加速FL算法验证 联邦学习开源框架FedLab相关 FATE 单位&#xff1a;微众银行 github: https://github.com/FederatedAI/FATE star&#xff1a;3.2k docs&#xff1a;https://github.com/FederatedAI/FATE/blob/master/doc…

电力系统中新型预测双二元变量机组组合问题(Matlab代码实现)

目录 1 概述 2 Matlab代码实现 3 参考文献 1 概述 高效求解大规模 SCUC 问题的关键在于削减其规模。文献[1]表明&#xff0c;安全约束机组组合问题中 大量的故障态安全约束是冗余且无效的&#xff0c;不会对SCUC 问题的最优解产生影响。因此&#xff0c;可以通过辨 识、删除…

为什么ArrayList的subList结果不能转换为ArrayList????

subList是List接口中的一个方法,该方法主要返回一个集合中的一段子集,可以理解为截取一个集合中的部分元素,它的返回值也是一个List。 让我们初始化一个例子:import java.util.ArrayList; import java.util.List;public class SubList_demo {public static void main(Strin…

OPTEE:CA-TA会话的创建(二)

前言 在上一篇我们知道TA是什么&#xff0c;以及为什么需要加载TA。这里来写写加载TA后&#xff0c;怎么CA和TA&#xff0c;TA和TA怎么建立会话&#xff0c;实现我们的功能的。 参考内容全部来自《手机安全和可信应用开发指南》&#xff0c;少有OPTEE书籍&#xff0c;感恩前辈…

牛客网-SQL专项训练15

①MySQL是一种(关系型)数据库管理系统。 关系型数据库的代表包括Oracle, Sql Server, MySQL。 ②小李在创建完一张数据表后,发现少创建了一列,此时需要修改表结构,应该用哪个语句进行操作?C 解析: 题目中说了需要修改表的结构, 故需要使用alter table 添加列: ALTER T…

大数据技术分享 - 话题挑战跳大开团

CSDN话题挑战赛第2期 参赛话题&#xff1a;大数据技术分享 大数据技术分享 - 话题挑战跳大开团 文章目录大数据技术分享 - 话题挑战跳大开团一、披挂上阵【老将出马】1. 历史战绩2. 再战江湖二、先手跳大【勇于开团】1. 个人经历2. Buff自取三、兵精粮足【底蕴深厚】1. 写作模…

QT串口助手-ZUA课设

QT串口助手成品展示QT全部程序构成zua.proserial.hmain.cppserial.cppserial.uiKeil全部程序构成main.cstm32f10x_conf.hstm32f10x_it.c5.stm32f10x_it.hbsp_usart.cbsp_led.cbsp_exit.cbsp_dht11.cbsp_delay.c介绍硬件野火F103指南者DHT11温湿度传感器QT全部程序构成QT设计的思…

虚拟机中centos扩展根目录空间

文章目录一、在vmware上为centos扩展存储二、在centos上扩充在进行yum安装软件时&#xff0c;由于空间不足一直提示“文件系统根目录上从磁盘空间不足”一、在vmware上为centos扩展存储 二、在centos上扩充 运行 df -h 查看容量情况&#xff0c;发现新扩展的空间并没有加载上。…

Babel 插件:30分钟从入门到实战

动手点关注 干货不迷路 &#x1f447;Babel 是一个 source to source&#xff08;源码到源码&#xff09;的 JavaScript 编译器&#xff0c;简单来说&#xff0c;你为 Babel 提供一些 JavaScript 代码&#xff0c;Babel 可以更改这些代码&#xff0c;然后返回给你新生成的代码。…

LeetCode程序员面试金典(第 6 版)上

目录 面试题 01.01. 判定字符是否唯一 面试题 01.03. URL化 面试题 01.04. 回文排列 面试题 01.05. 一次编辑 面试题 01.06. 字符串压缩 面试题 01.07. 旋转矩阵 面试题 01.08. 零矩阵 面试题 01.09. 字符串轮转 面试题 02.01. 移除重复节点 面试题 02.02. 返回倒数第…

BI测试

关于BI测试 前言:由于之前做过一段时间大数据测试,故整理BI测试知识点以供学习。BI测试: BI是从数据接入、数据准备、数据分析、数据可视化到数bai据分发应用的一系列过程,目的是为了辅助企业高效决策。而报表虽然最终也实现了数据可视化,但是对于数据分析的维度、深度、颗…

【数据结构与算法】排序(下篇)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《数据结构与算法》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 排序⚽归并排序⚾递归实现⚾非递归实现⚽常见排序算法的复杂度和稳定性分析⚾稳定性⚾具体分…

docker安装mysql(单体)

docker安装mysql mac的m1芯片上不支持5.7版本的镜像&#xff0c;因此可以直接选择拉取8.0及之后的版本 docker pull mysql创建mysql的宿主机数据卷挂载的文件夹 # mysql的配置文件&#xff0c;注意conf.d文件夹必须要创建&#xff0c;否则启动容器的时候&#xff0c;数据卷 …

linux 锁-- atomic per_cpu

atomic引入背景 对于 SMP 系统中&#xff0c;在开启 preempt 情况下&#xff0c;对于公共资源&#xff0c;如果存在两个 task 来进行更改&#xff0c;这就面临临界区资源竞争问题&#xff0c;此时会产生意想不到的结果&#xff0c;这是不符合预期的&#xff0c;因此需要来进行…

nginx-nginx的文件服务器的配置

nginx的文件服务器的配置location /data {charset gbk,utf-8;autoindex on;autoindex_exact_size off;autoindex_localtime on;limit_rate_after 10m;alias D:;allow all; }访问文件路径xxx/data访问成功的返回界面

CAS:385437-57-0,DSPE-PEG-Biotin,Biotin-PEG-DSPE,磷脂-聚乙二醇-生物素试剂供应

DSPE-PEG-Biotin&#xff08;磷脂-聚乙二醇-生物素&#xff09;的分子量有&#xff1a;1k&#xff0c;2k&#xff0c;3.4k等&#xff0c;其它的分子量可以定制。质量控制在95%&#xff0c;Biotin-PEG-DSPE主要用于科研实验使用&#xff0c;非药用&#xff0c;非食用。它溶于水和…