1.先給出遞歸的算法

void fnHanoi(int n, char a, char b, char c){
  
if(n==0return;
  fnHanoi(n
-1,a,c,b);
  std::cout
<<""<<n<<"個盤子從"<<a<<" 移動 "<<c<<std::endl;
  fnHanoi(n
-1,b,a,c);
}

2.非遞歸算法

通過對漢諾問題的遞歸算法及結果的分析,創造性的借助2叉樹的數據結構設計出非遞歸算法.具體算法思想請看北京交通大學,賀存薪的整理報告

#include <iostream>
using namespace std;

void fnHanoi(int m,int n){
    
int c,t,y;
    
for(t=n,y=t&1,c=m;y-1;t=t>>1,y=t&1,--c);//c表示層號
    switch((c&1)*3+(t>>1)%3)//c&1奇偶判斷,t>1為層中序號
    {
        
case 0:cout<<n<<"*:A - B"<<endl;break;
        
case 1:cout<<n<<"*:B - C"<<endl;break;
        
case 2:cout<<n<<"*:C - A"<<endl;break;
        
case 3:cout<<n<<"*:A - C"<<endl;break;
        
case 4:cout<<n<<"*:C - B"<<endl;break;
        
case 5:cout<<n<<"*:B - A"<<endl;break;
    }

}


int main(){
    
int nMax=1,nDish,nMove=1;
    cin
>>nDish;
    
for(nMax<<=nDish;nMove<nMax;++nMove)
        fnHanoi(nDish,nMove);
    
return 0;
}

另外給出另一種非遞歸算法
算法介紹:
首先容易證明,當盤子的個數為n時,移動的次數應等于2^n - 1。
一位美國學者發現一種出人意料的方法,只要輪流進行兩步操作就可以了。
首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上。
根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 A B C;
若n為奇數,按順時針方向依次擺放 A C B。
(1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子A,則把它移動到B;
若圓盤1在柱子B,則把它移動到C;若圓盤1在柱子C,則把它移動到A。
(2)接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。
即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤
這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。
(3)反復進行(1)(2)操作,最后就能按規定完成漢諾塔的移動。

最后就是用棧模擬遞歸算法,然后也可以實現非遞歸算法....
                          [如有錯誤,請指出]