Option Explicit
Private Sub hanoi(n As Integer, one As String, two As String, three As String)
If n = 1 Then
Print Tab(5); one; "------->"; three
Else
Call hanoi(n - 1, one, three, two)
Print Tab(5); one; "------->"; three
Call hanoi(n - 1, two, one, three)
End If
End Sub
Private Sub Form_Click()
Dim x As Integer
x = Val(InputBox("請輸入圓盤的個數"))
Print Tab(5); "將" & x & "個圓盤從A柱移到C柱的移動順序為"
Call hanoi(x, "A", "B", "C")
End Sub
B. 漢諾塔問題VB遞歸演算法實現
碟子移動規則如下:
1. 如果碟子總數為奇數,則首先將最小碟子(編號為1)移動到3號柱上;如果碟子總數為偶數,則移動到2號柱上。
2. 然後檢查3號柱是否已放滿碟子。若未滿,則重復步驟1直至所有碟子正確放置。
3. 下次移動的碟子根據前一個移動碟子編號的奇偶性來確定:
- 若前一個移動碟子編號為偶數,則本次移動的目標柱與上次相同,來源柱變改。
- 若前一個移動碟子編號為奇數,則本次移動的目標柱不變,比較另外兩柱子上碟子編號。將較小的碟子移動到較大的碟子上。若其中一柱無碟,將另一柱最上層碟子移動給它。
C. 關於漢諾塔問題的盡可能多的信息
漢諾塔
漢諾塔(又稱河內塔)問題是印度的一個古老的傳說。開天闢地的神勃拉瑪在一個廟里留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的一個在底下,其餘一個比一個小,依次疊上去,廟里的眾僧不倦地把它們一個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬一個,而且大的不能放在小的上面。解答結果請自己運行計算,程序見尾部。面對龐大的數字(移動圓片的次數)18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。
後來,這個傳說就演變為漢諾塔游戲:
1.有三根桿子A,B,C。A桿上有若干碟子
2.每次移動一塊碟子,小的只能疊在大的上面
3.把所有碟子從A桿全部移到C桿上
經過研究發現,漢諾塔的破解很簡單,就是按照移動規則向一個方向移動金片:
如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,漢諾塔問題也是程序設計中的經典遞歸問題。
補充:漢諾塔的演算法實現(c++)
#include <fstream>
#include <iostream>
using namespace std;
ofstream fout("out.txt");
void Move(int n,char x,char y)
{
fout<<"把"<<n<<"號從"<<x<<"挪動到"<<y<<endl;
}
void Hannoi(int n,char a,char b,char c)
{
if(n==1)
Move(1,a,c);
else
{
Hannoi(n-1,a,c,b);
Move(n,a,c);
Hannoi(n-1,b,a,c);
}
}
int main()
{
fout<<"以下是7層漢諾塔的解法:"<<endl;
Hannoi(7,'a','b','c');
fout.close();
cout<<"輸出完畢!"<<endl;
return 0;
}
如果你的機子足夠快,硬碟160G以上的化,可以把以上的程序改成64,運行完畢就是64漢諾塔的解法了。