九連環的遞迴算法
1、九連環簡介
九連周遊戲是止您妊旁己創造的,它的汗青十分悠暫,聽說是來源於戰國期間。九連環次要是由一個框架戰九個悅揮蟹組成:每一個悅揮蟹上連有一個曲杆,而那個曲杆則正在前面一個悅揮蟹內脫過,九個曲杆的另外一端用一塊木板或悅揮行肅對固定。
2、九連環的紀律
經由過程玩九連環您便會發明存正在如許一個紀律:
(1)第 1環能夠自在上下
(2)而上/下第 n環時(n>1),則必需謙足:
(a)第 n-1個環正在架上
(b)前 n-2個環局部正在架下
3、拆解/裝置的過程
正確的拆解是先以第 9環爲目的,先拆下它,簡化爲拆一個 8連環。接着再也第 8 環爲目的,拆下它,簡化爲拆一個 7連環。以此類推,曲至局部拆解。
其實裝置戰拆解是一個原理,由於他們均是利用上裏說的紀律去完秤弈。
正確是裝置也是先以第 9環爲目的,先拆上它,簡化爲拆一個 8連環。接着再也第 8 環爲目的,拆上它,簡化爲拆一個 7連環。以此類推,曲至局部裝置。
當然,如今那麼說是便於理解,當您深入的理解兩糲裏所說的紀律後,便會發明,裝置上第 9環後,問題能夠被簡化爲拆一個 7連喚爆而當拆上第 7 環後,問題便被簡化爲拆一個 5連環了,呵呵,便是如許的,沒有知講您如今能否大白我的意義……
4、一個猜念
認真察看九連環的構造、考慮九連環的紀律及拆解/裝置的過程,您是否是有一種覺得:九連環跟遞迴必然有聯絡。您看,遞迴的根本思惟是把一個年夜的問題合成爲一個規模矯Α的問題,從那些矯Α問題的解,機關出年夜問題的解,而那些規模矯Α的問題,用一樣的辦法合成成更小的問題,從更小問題的解,機關出矯Α的問題,一層層下來,普通最初老是能夠合成到能夠間接供解的小問題。嘿嘿,九連環的拆解/裝置何等的契合那個紀律啊……^_^
5、算法完成
以下是算法完成,法式寫的很簡約,省略了許多功用的完成,好比計數等,假如您覺得有須要的話,能夠自止加減上來,我相疑很容易,其實不要許多的改動。
The C Code Here:
/****************************/
任意 N連環均合用
日期:2002/11/6
法式設計@嶽坑蘩
騰訊QQ:3908000
電郵:[email protected]
/****************************/
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:
/****************************/
轉載註明盛世遊戲:http://www.shengshiyouxi.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;
}