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

2025_1_27 C语言内存,递归,汉诺塔问题

1.c程序在内存中的布局 在这里插入图片描述

  1. 代码段(Code Segment)
    位置:通常位于内存的最低地址。
    用途:存储程序的可执行指令。
    特点:只读,防止程序运行时被修改。
  2. 数据段(Data Segment)
    位置:紧随代码段之后。
    用途
    存储全局变量和静态变量。
    包含初始化的全局变量和静态变量(已初始化的数据)。
    包含未初始化的全局变量和静态变量(未初始化的数据,通常初始化为零)。
    特点:数据段分为已初始化和未初始化两部分。
  3. BSS段(Block Started by Symbol)
    位置:数据段的一部分,通常位于数据段的末尾。
    用途:存储未初始化的全局变量和静态变量。
    特点:在程序启动时,由操作系统自动初始化为零。
  4. 堆空间(Heap)
    位置:数据段之后,栈空间之前。
    用途:动态内存分配。
    特点
    从低地址向高地址生长。
    可以动态扩展,但扩展有限,受系统内存限制。
    程序员通过malloc、calloc、realloc等函数手动管理。
  5. 栈空间(Stack)
    位置:通常位于内存的高地址区域。
    用途
    存储函数调用时的局部变量、函数参数和返回地址。
    管理函数调用的执行流程。
    特点
    从高地址向低地址生长。
    自动管理,具有“后进先出”(LIFO)的特性。
    每个函数调用都会在栈上分配一个栈帧,包含局部变量和返回地址。
  6. 内核虚拟内存(Kernel Virtual Memory)
    位置:通常不直接显示在用户程序的内存布局中,但存在于操作系统内核中。
    用途:操作系统内核的运行环境。
    特点:与用户程序隔离,提供安全性。

±----------------------------------+
| 内核虚拟内存 |
±----------------------------------+
| 栈空间(Stack) |
| (高地址) |
±----------------------------------+
| 堆空间(Heap) |
| (低地址) |
±----------------------------------+
| 数据段(Data) |
| (包括BSS段) |
±----------------------------------+
| 代码段(Code) |
| (低地址) |
±----------------------------------+

2. 递归

递归要有三要素
1.要有递归体(即函数自己调用自己的语句)
2.递归的出口(如果不给递归设置结束条件,那么就一定会出现栈溢出的情况)
3.递归的深度(每次递归都会导致栈帧进栈,如果深度过大,那么栈会溢出)

long jiechen(int n) {//先写边界条件if (n == 1) {return 1;}//再写递归体return n * jiechen(n - 1);
}
int main() {long result = jiechen(5);printf("%d", result);return 0;
}

递归的优点就是简洁,清晰
递归的缺点就是栈溢出风险高,效率低,内存消耗大,难以调试,难以思考

汉诺塔问题递归解法:
在这里插入图片描述

int hanoi(int n) {if (n == 2) {return 3;}return hanoi(n - 1) + 1 + hanoi(n - 1);
}int main() {//print_hello(5);//long result = jiechen(5);int result = hanoi(3);printf("%d", result);return 0;
}
http://www.lryc.cn/news/527920.html

相关文章:

  • 开源音乐管理软件Melody
  • Nginx开发01:基础配置
  • 【TCP 协议】确认应答机制 超时重传 三次握手 四次挥手
  • jenkins-k8s pod方式动态生成slave节点
  • 基于vue和elementui的简易课表
  • 可用的IPv6公共DNS(2025年1月更新)
  • c高级复习
  • 电子信息工程专业主要研究哪一方面东西?
  • RU 19.26安装(手工安装各个补丁)
  • 深入理解Pytest中的Setup和Teardown
  • 如何利用AI工具来进行数据分析
  • 具身智能体俯视全局的导航策略!TopV-Nav: 解锁多模态语言模型在零样本目标导航中的顶视空间推理潜力
  • npm:升级自身时报错:EBADENGINE
  • 微信小程序实现自定义日历功能
  • Vue 3 中的 toRef 与 toRefs:使用与案例解析
  • 问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务
  • 代码随想录day20
  • 【ProxyBroker】用Python打破网络限制的利器
  • 分布式微服务系统架构第88集:kafka集群
  • RocketMQ原理—5.高可用+高并发+高性能架构
  • 下载Visual Studio Community 2019
  • 一文简单回顾Java中的String、StringBuilder、StringBuffer
  • 27. C语言 强制类型转换详解
  • git困扰的问题
  • 反向代理模块。。
  • 【Linux基础指令】第三期
  • Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman
  • 利用JSON数据类型优化关系型数据库设计
  • Nxopen 直齿轮参数化设计
  • 线程配置经验