九连环的递归算法,九连环算法(第2版)

九连环简介

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

九连环规律

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

拆解/安装的过程

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

递归算法

本算法逻辑适用任意个数的连环问题,于2002年11月6日设计,2006年2月28日修改如下

#include<iostream>
using namespace std;

class
 Ring
{
public
:
  Ring(
int
 Num):RingNum(Num){}
  
void
 StartDown();
  
void
 StartUp();
private
:
  
int
 RingNum;
  
void DownRing(int
 n);
  
void UpRing(int
 n);
};

void Ring::DownRing(int
 n)
{
  
if(n>2) DownRing(n-2
);
  cout
<<"下第"<<n<<""
;
  
if(n>2) UpRing(n-2
);
  
if(n>1) DownRing(n-1
);
}

void Ring::UpRing(int
 n)
{
  
if(n>1) UpRing(n-1
);
  
if(n>2) DownRing(n-2
);
  cout
<<"上第"<<n<<""
;
  
if(n>2) UpRing(n-2
);
}

void
 Ring::StartDown()
{
  DownRing(RingNum);
}

void
 Ring::StartUp()
{
  UpRing(RingNum);
}

int
 main()
{
  Ring RingN(
9
);
  RingN.StartDown();
  RingN.StartUp();
  
return 0
;
}

2002年九连环算法第1版中国传统智力游戏--九连环的递归算法(九连环算法第1版)

2006年九连环算法第2版九连环的递归算法(九连环算法第2版)

2016年九连环算法第3版九连环算法(第3版)

智力游戏--九连环算法之一

11-02

关键词:九连环、N连环、递归、拆解、安装rnrnrn一、九连环简介rnrn 九连环游戏是中国人自己发明的,它的历史非常悠久,据说是起源于战国时期。rnrn 九连环主要是由一个框架和九个圆环组成:每个圆环上连有一个直杆,而这个直杆则在后面一个圆环内穿过,九个直杆的另一端用一块木板或圆环相对固定。rnrn二、九连环的规律rnrn 通过玩九连环你就会发现存在这样一个规律:rnrn (1)第 1 环可以自由上下rn (2)而上/下第 n 环时(n>1),则必须满足:rn (a)第 n-1 个环在架上rn (b)前 n-2 个环全部在架下rnrn三、拆解/安装的过程rnrn 正确的拆解是先以第 9 环为目标,先拆下它,简化为拆一个 8 连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7 连环。以此类推,直至全部拆解。rnrn 其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。rn 正确是安装也是先以第 9 环为目标,先装上它,简化为装一个 8 连环。接着再也第 8 环为目标,装上它,简化为装一个 7 连环。以此类推,直至全部安装。rn 当然,现在这么说是便于理解,当你深刻的理解了上面所说的规律后,就会发现,安装上第 9 环后,问题可以被简化为装一个 7 连环,而当装上第 7 环后,问题就被简化为装一个 5 连环了,呵呵,就是这样的,不知道你现在是否明白我的意思……rnrn四、一个猜想rnrn 仔细观察九连环的结构、思考九连环的规律及拆解/安装的过程,你是不是有一种感觉:九连环跟递归一定有联系。你看,递归的基本思想是把一个大的问题分解为一个规模较小的问题,从这些较小问题的解,构造出大问题的解,而这些规模较小的问题,用同样的方法分解成更小的问题,从更小问题的解,构造出较小的问题,一层层下去,一般最后总是可以分解到可以直接求解的小问题。嘿嘿,九连环的拆解/安装多么的符合这个规律啊……^_^rnrn五、算法实现rnrn 以下是算法实现,程序写的很简洁,省略了很多功能的实现,比如计数等,如果你觉得有必要的话,可以自行添加上去,我相信很容易,并不要很多的改动。rnrn The C Code:rnrn/*任意 N 连环均适用 */rn/*程序设计:吴文绛 */rn/*腾讯:3908000 */rn/*日期:2002/08/19 */rnrnvoid DownRing(int n) rnrn if(n>2) DownRing(n-2);rn printf("下第%d环\n",n);rn if(n>2) UpRing(n-2);rn if(n>1) DownRing(n-1);rnrnrnvoid UpRing(int n)rnrn if(n>1) UpRing(n-1);rn if(n>2) DownRing(n-2);rn printf("上第%d环\n",n);rn if(n>2) UpRing(n-2);rnrnrnvoid main()rnrn printf("拆解\n");rn DownRing(9);rn printf("安装\n");rn UpRing(9);rn printf("结束\n");rnrnrn 论坛

没有更多推荐了,返回首页