漢諾塔問題的python實現

2021-08-28 04:52:25 字數 1573 閱讀 3924

問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

**實現:

# -*- coding: utf-8 -*-

"""created on mon sep 17 10:24:41 2018

@author: 無止境

function:漢諾塔問題

"""step=0

def hanoi(n,a,b,c):#形參接收實參的值

global step#修改全域性變數時,用global宣告,只引用不修改的話不需要global宣告

if n==1:

print("%c-->%c\n"%(a,c))#注意python的輸出

step=step+1

else:

hanoi(n-1,a,c,b)#n-1個圓盤通過c移動到b

print("%c-->%c\n"%(a,c))#把a上的乙個圓盤移動到c

step=step+1

hanoi(n-1,b,a,c)#把b上的n-1個圓盤通過a移動到c

n=input("please input n :")#獲得輸入

n=int(n)#轉換為數值型

hanoi(n,'a','b','c')#傳入字元型實參

print("step number :",step)

##def move(n,a,b,c):

# #a,b,c分別是三根柱子,n為套在a柱上的圓圈個數

# if n==1:

# print(a,'-->',c)

# return

# move(n-1,a,c,b)

# move(1,a,b,c)

# move(n-1,b,a,c)

#

#move(3,'a','b','c')

##這裡我用大寫字母abc表示實參是為了與形參小寫的abc區別開,這步很關鍵

漢諾塔問題是乙個經典的遞迴問題,對於這個問題,我們可以把它簡單的去看成是如何用n-1去表示n。

在a,b,c三個柱子上,我們先假設a柱上只有兩個盤子,那麼很簡單,只需要把最上面的那個盤子移到b柱上,再把a柱上最下面的盤子移到c柱上,最後把b柱的盤子移到c柱就可以了。

假設我們有n個盤子,那麼可以把最下面的盤子看成是第n個盤子,而我們要做的是把上面n-1個盤子移到b柱上,再把第n個盤子移到c柱。我們可以把b柱視為主中轉站。

在將n-1個盤子移到b柱的過程中,我們需要借助c柱作為分中轉站,當完成n-1個盤子的移動時,此時b柱上存在n-1個盤子,而我們接下來要做的,和之前類似,就是借助把n-2個盤子移動到a柱,把第n-1個盤子移動到c柱。在移動n-2個盤子到a柱時,我們同樣要借助c作為分中轉站。

現在問題就很清晰了,在移動的整個過程中,變換的只有ab這兩個主中轉站,而分中轉站c是不變的,因為c作為中轉的作用僅僅是為了盤子在ab之間的移動。

這樣,我們很容易就可以用遞迴寫出整個過程的**。

python實現漢諾塔問題

count 0 defhanoi n,x,y,z 圓盤數量,起始柱子,中間柱子,目標柱子,global count if n 1 print format 1,x,z count 1 else hanoi n 1,x,z,y 把 n 1 個圓盤從x移到y上,需借助z x z y print form...

python實現漢諾塔問題

以下圖的三層漢諾塔為例,開始柱指的是開始狀態時存放所有盤子的柱子,中轉柱指的是中間狀態時暫時存放n 1個 三層就是3 1個 盤子的柱子,目標柱指的是盤子最終要移動到的柱子。這裡需要注意,開始柱,中轉柱,目標柱並不是一成不變的,而是會根據層次的不同而改變。漢諾塔問題可這麼簡單理解 要解決從下往上數第n...

漢諾塔問題的Python實現

漢諾塔問題 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。即 ...