汉诺塔问题, 用递归方法求集合中的中位数

简介: 汉诺塔问题, 用递归方法求集合中的中位数

打印解决汉诺塔问题的所有步骤

 1 void Move(int n, int start, int goal, int temp)
 2 {
 3     if (n >= 1)
 4     {
 5         Move(n - 1, start, temp, goal);        //将最上面的n-1个盘子移到temp柱子上
 6         printf("Move disk %d from %d to %d.\n", n, start, goal);    //将第n个柱子移到goal柱子上
 7         Move(n - 1, temp, goal, start);        //将temp柱子上的n - 1个柱子移到goal柱子上
 8     }
 9         
10     
11 }

 用递归方法求集合中的中位数

 1 void Swap(ElementType *X, ElementType *Y)
 2 {
 3     ElementType temp;
 4     temp = *X;
 5     *X = *Y;
 6     *Y = temp;
 7 }
 8 
 9 ElementType FindKthLargest(ElementType s[], int K, int Left, int Right)
10 {    //在s[Left]……s[Right]中找第K大的元素
11     ElementType e = s[Left];        //简单取首元素为基准
12     int L = Left, R = Right;
13     
14     while (1)
15     {
16         while ((Left <= Right) && (e <= s[Left])) Left++;    
17         while ((Left < Right) && (e > s[Right])) Right--;
18         if (Left < Right)
19             Swap(&s[Left], &s[Right]);
20         else
21             break;    //最终brak退出时,Left一定指向第二个集合的第一个元素
22     }
23     Swap(&s[Left - 1], &s[L]);
24     if ((Left - L - 1) >= K)
25         return FindKthLargest(s, K, L, Left - 2);    //Left - 1是基准,所以下一次递归的右边界应该是Left - 2
26     else
27     if ((Left - L - 1) < K - 1)
28         return FindKthLargest(s, K - (Left - L - 1) - 1, Left, R);    //K 先减去第一个集合的Left - L - 1个元素,在减去基准元素,所以下一次递归应该是在第二个集合中求第K - (Left - L - 1) - 1个元素
29     else
30         return e;        //找到,返回
31 }
32 
33 //封装前面这个查找函数
34 ElementType Median(ElementType s[], int N)
35 {
36     return FindKthLargest(s, (N + 1) / 2, 0, N - 1);
37 }

这个方法实际上利用了和快速排序相同的思路

简单选取S中的第一个元素e,根据e将集合S分为{e}和大于等于e的元素集合S1、小于e的元素集合S2; 然后通过判别集合S1的大小,将从S集合中找第K大数问题转换为在S1 和S2中的查找问题,由于S1或S2中的集合规模都比S小,这样就将复杂的问题转化为规模相对较小的问题,这也是递归函数的设计基础

相关文章
|
2月前
|
弹性计算 网络协议 安全
在阿里云 ECS 上把 DSH 接进 MCP 管理控制台:出网、安全组与备份
dsh-mcp-panel 是 DeepSeek Harness 官方 MCP 管理控制台,轻量易装但部署关键在出网配置:需配安全组出向、NAT/SNAT、内网地址或 ssh 端口转发,并确保系统盘余量与 Node 版本(≥22.19.0)达标。
261 2
|
7月前
|
定位技术 数据中心 Python
金融风控中IP地址查询如何识别异常登录?IP离线库提升欺诈拦截准确率的完整指南
传统IP信誉库已难应对住宅中继攻击(89.7%恶意IP活跃不足1月)。金融风控亟需可私有化部署、日更、毫秒级响应的IP离线库,精准识别中继/IP风险,提升异地登录拦截率、降低误伤,满足合规与高并发要求。(239字)
673 0
金融风控中IP地址查询如何识别异常登录?IP离线库提升欺诈拦截准确率的完整指南
|
7月前
|
人工智能 IDE 机器人
给阿里产品团队的真心话:千问很强,但我们需要它能“干活”!
作为一名一线程序员,建议千问尽快打通项目目录读取功能,并实现手机电脑端同步,做真正能干活的AI工具。
|
9月前
|
数据采集 人工智能 自然语言处理
电商行业有哪些agent应用
AI时代,瓴羊推出三大企业级Agent:Quick Service客服Agent实现7×24小时智能应答与情绪安抚;Quick BI“智能小Q”支持自然语言问数、自动分析与可执行建议;Data Agent依托Dataphin构建统一数据底座,夯实治理根基。真场景、真数据、真落地。
|
11月前
|
机器学习/深度学习 存储 数据采集
🔥 高频面试题汇总
本文系统梳理了大模型核心技术,涵盖Transformer架构、训练优化、推理部署及显存估算等关键主题,并结合面试场景提供回答框架与实战计算题解析,助力深入理解与高效表达。
523 0
🔥 高频面试题汇总
|
12月前
|
人工智能 监控 安全
虚实融合:Rokid AR眼镜赋能医疗设备智能操作培训系统开发全解析
本文详解基于Rokid CXR-M SDK开发的AR医疗培训系统,融合蓝牙/Wi-Fi双通道通信、自定义AI助手与提词器场景,实现操作指引、实时监控、安全预警与数据化评估。系统显著提升培训效率,降低操作失误,为智慧医疗提供可落地的技术方案。
|
监控 算法 搜索推荐
JVM性能优化实战手册:从监控到调优策略
本文基于DataBuff监控数据,系统探讨JVM性能优化实战,涵盖监控体系构建、GC调优、内存与线程管理等关键策略。通过调整堆大小、启用G1回收器等参数优化,有效降低Full GC频次,提升应用稳定性,为Java性能调优提供可落地的实践指南。(238字)
|
安全 虚拟化 UED
VMware VeloCloud SD-WAN 6.2 新增功能简介
VMware VeloCloud SD-WAN 6.2 新增功能简介
493 0
VMware VeloCloud SD-WAN 6.2 新增功能简介
|
机器学习/深度学习 JSON 监控
拼多多API库存预警系统:避免缺货损失千万!
在电商运营中,缺货可能导致订单流失与经济损失,拼多多推出的API库存预警系统可实时监控库存,及时预警,降低缺货风险。系统支持多语言集成,商家可快速构建自动化监控与补货流程,提升供应链效率,保障销售连续性。
1057 0

热门文章

最新文章