九連環的遞迴算法(C戰C++)

九連環的遞迴算法(C戰c++
  九連環的遞迴算法
  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;

}


  
發佈了25 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章