九连环的递归算法(C和C++)

简介: 九连环游戏是中国人自己发明的,它的历史非常悠久,据说是起源于战国时期。九连环主要是由一个框架和九个圆环组成:每个圆环上连有一个直杆,而这个直杆则在后面一个圆环内穿过,九个直杆的另一端用一块木板或圆环相对固定。

一、九连环简介

九连环游戏是中国人自己发明的,它的历史非常悠久,据说是起源于战国时期。九连环主要是由一个框架和九个圆环组成:每个圆环上连有一个直杆,而这个直杆则在后面一个圆环内穿过,九个直杆的另一端用一块木板或圆环相对固定。

二、九连环的规律

通过玩九连环你就会发现存在这样一个规律:

(1)第 1环可以自由上下
(2)而上/下第 n环时(n>1),则必须满足:
 (a)第 n-1个环在架上
 (b)前 n-2个环全部在架下

三、拆解/安装的过程

正确的拆解是先以第 9环为目标,先拆下它,简化为拆一个 8连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7连环。以此类推,直至全部拆解。

其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。

正确是安装也是先以第 9环为目标,先装上它,简化为装一个 8连环。接着再也第 8 环为目标,装上它,简化为装一个 7连环。以此类推,直至全部安装。

当然,现在这么说是便于理解,当你深刻的理解了上面所说的规律后,就会发现,安装上第 9环后,问题可以被简化为装一个 7连环,而当装上第 7 环后,问题就被简化为装一个 5连环了,呵呵,就是这样的,不知道你现在是否明白我的意思……

四、一个猜想

仔细观察九连环的结构、思考九连环的规律及拆解/安装的过程,你是不是有一种感觉:九连环跟递归一定有联系。你看,递归的基本思想是把一个大的问题分解为一个规模较小的问题,从这些较小问题的解,构造出大问题的解,而这些规模较小的问题,用同样的方法分解成更小的问题,从更小问题的解,构造出较小的问题,一层层下去,一般最后总是可以分解到可以直接求解的小问题。嘿嘿,九连环的拆解/安装多么的符合这个规律啊……^_^

五、算法实现

以下是算法实现,程序写的很简洁,省略了很多功能的实现,比如计数等,如果你觉得有必要的话,可以自行添加上去,我相信很容易,并不要很多的改动。

The C Code Here:

/****************************/
           任意 N连环均适用
           日期:2002/11/6
           程序设计:道可道
           腾讯QQ:3908000
           电邮:Havelife@mail.csdn.net 
/****************************/

void UpRing(int  n);         /*函数声明*/

void DownRing(int  n)     /*下环逻辑*/
{
    if(n>2) DownRing(n-2);
    printf("下第%d环\n",n);
    if(n>2) UpRing(n-2);
    if(n>1) DownRing(n-1);
}

void UpRing(int  n)         /*上环逻辑*/
{
    if(n>1) UpRing(n-1);
    if(n>2) DownRing(n-2);
    printf("上第%d环\n",n);
    if(n>2) UpRing(n-2);
}

void main()                

{

    printf("拆解\n");
    DownRing(9);
    printf("安装\n");
    UpRing(9);
    printf("结束\n");
}

 

The C++ Code Here:
 
/****************************/
           任意 N连环均适用
 
           日期:2012/8/12
 
           程序设计:YCY
           电邮:ycy360@163.com
 
/****************************/
 
 
 
#include<iostream> 
 
using namespace std; 
 
 
 
class Ring
 
{
 
public:
 
       Ring(int n):nRingNum(n){}
 
       void UpRing(int n);
 
       void DownRing(int n);
 
       void startDownRing(); 
 
       void startUpRing();
 
       void totalCnt();
 
       void setUpZero();
 
private:
 
       int nRingNum;
 
       static int s_nCnt;
 
};
 
 
 
int Ring::s_nCnt = 0;    //计数
 
void Ring::UpRing(int n)  //Upring是DownRing的逆过程.
 
{
 
       ++s_nCnt;
 
       if(n>1) UpRing(n-1);
 
       if(n>2) DownRing(n-2);
 
       cout << "上第" << n << "环" << endl;
 
       if(n>2) UpRing(n-2);
 
}
 
 
 
void Ring::DownRing(int n)
 
{
 
       ++s_nCnt;
 
       if(n>2) DownRing(n-2);
 
       cout <<"下第" << n << "环" << endl;
 
       if(n>2) UpRing(n-2);
 
       if(n>1) DownRing(n-1);
 
}
 
 
 
void Ring::startDownRing()
 
{
 
       cout << "拆解" << nRingNum << "连环操作!" << endl;
 
       DownRing(nRingNum);
 
       cout << "拆解完毕" << endl;
 
}
 
 
 
void Ring::startUpRing()
 
{
 
       cout << "安装" << nRingNum << "连环操作!" << endl;
 
       UpRing(nRingNum);
 
       cout << "安装完毕" << endl;
 
}
 
 
 
void Ring::totalCnt()
 
{
 
       cout << "共累计上、下环" << s_nCnt << "次!" << endl << endl;
 
}
 
 
 
void Ring::setUpZero()
 
{
 
       Ring::s_nCnt = 0;
 
}
 
 
 
int main()                  
 
{
 
       Ring ring(3);
 
       ring.startDownRing();
 
       ring.totalCnt();
 
       ring.setUpZero();      //置为0
 
 
 
       ring.startUpRing();
 
       ring.totalCnt();
 
       ring.setUpZero();
 
       
 
       return 0;
 
}

 

存在以下序列即:
5E4C6D57-1E0F-43a8-B765-B6B163351C0B.png

 
呈现阶层递增的趋势。

相关文章
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
246 2
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
383 15
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
301 17
|
10月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
270 0
|
11月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
329 0
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
278 4
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
300 8
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
305 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。

热门文章

最新文章