題目:
漢諾塔問題來自乙個古老的傳說:在世界剛被建立的時候有一座鑽石寶塔(塔a),其上有64個金碟。所有碟子按從大到小的次序從塔底堆放至塔頂。緊挨著這座塔有另外兩個鑽石寶塔(塔b和塔c)。從世界創始之日起,婆羅門的牧師們就一直在試圖把塔a上的碟子移動到塔c上去,其間借助於塔b的幫助。每次只能移動乙個碟子,任何時候都不能把乙個碟子放在比它小的碟子上面。當牧師們完成任務時,世界末日也就到了。
採用問題歸約法把漢諾塔問題分成以下三個步驟實現:
1.將塔a上的n-1個碟子借助塔c先移到塔b上
2.把塔a上剩下的乙個碟子移到塔c上
3.把n-1個碟子從塔b借助於塔a移到塔c上
實驗要求:
1.讓盤子數從2 開始到7進行實驗,記錄程式執行時間和遞迴呼叫次數。
2.畫出盤子數n和執行時間t 、遞迴呼叫次數m的關係圖,並進行分析
題目解析:
1.漢諾塔問題規約程式設計
2.程式執行時間輸出
3.遞迴呼叫計時器設計
**:
import copy
import time
# 狀態陣列初始化,一開始所有盤都在第乙個柱子
definit_status
(n):
status =
s =for i in
range
(n):
s.clear(
)chr
(i+ord
('a'))
)1))
return status
# 返回塔符號對應的索引位置 eg:a->1 b->2 c->3 ...
deffind_index
(s, status)
:for i in
range
(len
(status)):
if status[i][0
]== s:
return i+
1return-1
# 列印狀態陣列
defprint_status
(status, n)
:# 對問題描述的狀態進行列印
for i in
range
(n):
print
(status[i][1
], end="")
print
("\n"
)# 對梵塔問題進行問題規約,an-1->b, a_last->c, bn-1->c
deffanta
(n, n, a, b, c, status)
:global use_time
use_time = use_time +
1if n ==1:
# print(str(n)+":"+a+"->"+c)
# 將當前塊對應的狀態改為c塔對應的索引
status[n-1]
[1]= find_index(c, status)
# print_status(status, n)
else
: fanta(n, n-
1, a, c, b, status)
# print(str(n)+":"+a+"->"+c)
# 將當前塊對應的狀態改為c塔對應的索引
status[n-1]
[1]= find_index(c, status)
# print_status(status, n)
fanta(n, n-
1, b, a, c, status)
if __name__ ==
"__main__"
:print
("輸入圓盤數n:"
) n =
int(
input()
) start = time.time(
) status = init_status(n)
# print_status(status, n)
# 用於記錄一共使用多少次遞迴
use_time =
0 fanta(n, n,
'a',
'b',
'c', status)
end = time.time(
)print
("n="
, n,
",程式執行時間為:",(
(end - start)
*1000000),
"us"
)print
("n="
, n,
",遞迴呼叫次數為:"
, use_time)
漢諾塔問題
問題 假設有3個分別命名為x,y,z的寶塔,在塔座x上插有n個直徑大小各不相同,從小到大編號為1,2,3。n的圓盤。現要求將x軸上的n個圓盤移至塔座z上 並仍然按同樣的順序疊排,圓盤移動時必須遵循下列規則 1.每次只能移動乙個圓盤 2.圓盤可以插在x,y和z中的任一塔座上 3.任何時刻都不能將乙個較...
漢諾塔問題
問題是 印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每次只能搬乙個,而且大的不能放在小的上面。解答結果請自...
漢諾塔問題
漢諾塔如下圖所示 需要我們完成的事情是把盤子移動到c,規則就不贅述了。演算法思想 總體來說是利用遞迴完成的。假設 1 a上只有乙個盤子,我們直接移動到c即可 2 a上有兩個盤子,我們把第二個盤子上面的所有盤子 此時只有乙個,比較容易 移動到b,再把第二個盤子移動到目的地c,最後把b上的盤子移動到c ...