当前位置: 首页 > ds >正文

C语言中的递归1.0

一、递归函数概念引入

简单来说就是自己调用自己

递归函数满足的两个条件:

1.每次调用函数本身,必须一次又一次接近最终结果

2.必须有停止条件

二、代码展示

用递归求1到4的和 代码如下

三、代码分析

首先进入main主函数入口

int sum = getsum(4);

就这个具体题目来看 我们要求的是1到4的和

定义一个名为sum的变量 把getsum的调用函数的值 赋值给sum

这时我们进入了getsum的函数调用部分 

我们会从main主函数跳出来到getsum函数里面

当n的值为1的时候即getsum(1)和为1 此时返回值是1

可以理解为我们要求的是1到4的和 那么从1开始那么就是返回值是1 n值为1时即和为和为0 终止

然后逆着往回去带入数值

这一个题目进入main函数这样看 首先是getsum(4)

然后跳出main函数进入了getsum函数里面

第一次 n==4 不满足n==1 所以他不会得到返回值

伪代码分析:

当n==4时 temp = getsum(3) 得到返回值temp+n=getsum(3)+4

这时得到了getsum(3) 又要调用函数getsum了

当n==3时 temp = getsum(2) 得到返回值temp+n=getsum(2)+3

这时得到了getsum(2) 又要调用函数getsum了

当n==2时 temp = getsum(1) 得到返回值temp+n=getsum(1)+2

这时得到了getsum(1) 又要调用函数getsum了

但是此时n的值是1了 那么返回值就是1了 那么将把n的值往回带

temp+n=getsum(3)+4

            =getsum(2)+3+4

            =getsum(1)+2+3+4

            =1+2+3+4

            =10

最后我们算出getsum函数的返回值是temp+n即是10 所以

回到main函数中int sum=10 把函数getsum的返回值给sum

最后打印出来 那么sum的值就是10

总结

递归的核心就是"递"和"归"的结合

四、运行结果

五、拓展延伸

汉诺塔圆盘规则:

只能动最上面的圆盘,大圆盘不能压小圆盘,借助中间柱子把圆盘全移到目标柱

推算过程:

假设圆盘个数为n,移动次数是f(n)

当n=1时, 只需要将圆盘从A移动到C,f(n)是1

当n=2时, 只需要将圆盘从A移动到C,f(n)是3,只能动最上面的圆盘,大圆盘不能压小圆盘,借助中间柱子把圆盘全移到目标柱

由于我们已经知道可以将圆盘从 A 移动到 C,且移动次数 f(2) 是 3 现在,我们在这个基础上进行续写,推导 n≥3 时的情况。

当 n=3 时,可以按照如下步骤进行:

将最上面的圆盘(即最小的圆盘)从 A 移动到 C。这一步需要1次移动。

将剩下的两个圆盘(看作一个整体,视为一个较大的圆盘)从 A 移动到 B。这一步实际上是 f(2)=3 次移动(即将两个圆盘从 A 通过 C 移动到 B)。

最后,将最上面的那个圆盘(之前从 A 移动到 C 的那个)从 C 移动回 B(这是为了空出 C 柱以便接收接下来的圆盘),然后将剩下的两个圆盘(之前在 B 柱上的那两个)从 B 移动到 C。

这一步又需要 f(2)=3 次移动,但加上之前从 C 移动回 B 的那一次,总共是 3+1=4 次中的最后1次与 f(2) 的3次合并计算,所以整体上看作是再进行了 f(2) 次移动后加上最初从 A 到 C 的1次,共 1+3+3=7 次中的关键步骤合并,

简化为理解上的 f(3)=f(2)+1+f(2)=2f(2)+1 的递推形式,即实际执行是7步但逻辑上表达为基于 f(2) 的递推,这里为了符合递推式表述我们按逻辑上的 2f(2)+1 来理解,即 f(3)=2×3+1=7,但实际操作是1到C,2个作为整体3步从A经C到B,再将1从C移到B(此步为逻辑上的合并步骤,实际是执行中的一步),然后整体2个从B到C的3步,共7步

这个汉诺塔的推导过程理解不了 没有关系 可以先把规律记住 如下:

总结:

当n=1时,f(1)=1

当n=2时, ,f(2)=3

当n=3时, ,f(3)=7

以此类推……

通过观察和归纳,我们可以发现对于 n≥2 的情况,移动次数 f(n) 可以表示为:

总结的规律为:

f(n)=2f(n−1)+1

反过来带进去验证一下

当n=2时, ,f(2)=2f(1)+1=2×1+1=3

当n=3时, ,f(3)=2f(2)+1=2×3+1=7

以此类推……说明规律没问题

六、代码展示

下图代码中的else语句中的返回值就是我们刚刚推导的公式

f(n)=2f(n−1)+1

疑点解析:为什么当n==1的时候 返回值是1 因为最少移动一个圆盘呀 不然没得移动的啦

在main函数中的逻辑和上面的逻辑一样 归结起来 递归的核心就是"递"和"归"的结合

简单理解就是先把hannuota函数调用里面的走完

然后当n==1的时候 有返回值 把返回值往回带入反推

逻辑与最开始的 引入的一个递归例题逻辑一致(用递归求1到4的和) 这里就不在赘述

七、代码运行

八、阶乘和斐波拉契数列

这块代码会在C语言中的递归2.0版本会有详细讲解

感谢观看 如果您觉得对您有帮助 可以一键三连哦

当然有失误的地方 也欢迎广大网友指正喔~

博主会持续更新滴

 

 

 

 

http://www.xdnf.cn/news/1356.html

相关文章:

  • 在C#串口通信中,一发一收的场景,如何处理不同功能码的帧数据比较合理,代码结构好
  • Transformer:引领深度学习新时代的架构
  • 深入探究Python中`__init__.py`文件的奥秘
  • SOA半导体光放大器在光纤光栅解调系统中的应用分析
  • python三维矩阵的维度
  • 将输入帧上下文打包到下一个帧的预测模型中用于视频生成
  • 什么是区块?
  • 【Java】Hibernate的检索方式的概述
  • pytest心得体会
  • Linux避免文件误删详解(Linux Avoids File Deletion Errors with Detailed Explanation)
  • 深入剖析TCP协议(内容一):从OSI与TCP/IP网络模型到三次握手、四次挥手、状态管理、性能优化及Linux内核源码实现的全面技术指南
  • Python----深度学习(神经网络的过拟合解决方案)
  • 单调栈-每日温度
  • 1、AI及LLM基础:OpenAI 开发
  • 手写深拷贝函数
  • 基于RabbitMQ实现订单超时自动处理
  • 服务器编译环境配置及数据接收脚本编写(11)
  • 蓝桥杯 19. 最大比例
  • 【3】CICD持续集成-k8s集群中安装Jenkins-agent(主从架构)
  • 【数据可视化-24】巧克力销售数据的多维度可视化分析
  • 解读大型语言模型:从Transformer架构到模型量化技术
  • 3小时速通Python-Python学习总部署、总预览(一)
  • transformer 解码器和输出部分结构
  • gradle可用的下载地址(免费)
  • Linux 内核中 cgroup 子系统 cpuset 是什么?
  • nodejs模块暴露数据的方式,和引入(导入方式)方式
  • 高级java每日一道面试题-2025年4月21日-基础篇[反射篇]-如何使用反射获取一个类的所有方法?
  • 移动通信运营商对MTU的大小设置需求
  • 【codeforces思维题】前缀和的巧妙应用(2053B)
  • 【AI News | 20250422】每日AI进展