人工智慧 漢諾塔問題

2021-10-13 07:54:10 字數 2302 閱讀 8883

題目:

漢諾塔問題來自乙個古老的傳說:在世界剛被建立的時候有一座鑽石寶塔(塔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 ...