Python遞迴之漢諾塔

2021-08-08 06:18:16 字數 1188 閱讀 4662

漢諾塔一般有兩種返回結果,一種是計算移動的次數,另一種是列印輸入移動的步驟。假設有a,b,c三個柱子,初始時盤子都在a柱子上,需要借助b做中轉站把所有盤子都移動到c上。

1. 計算移動的次數

首先定義乙個函式hantower(n),用來計算移動的次數。如果n=1,直接從a移動到c,返回結果1;如果n>1,把上面n-1個盤子看成乙個整體,借助c做中轉站把n-1盤子移動到b,移動次數為hantower(n-1);然後把最下面盤子移動到c,移動次數為1;最後把n-1個盤子作為整體,借助a做中轉站把n-1盤子移動到c,移動次數為hantower(n-1);這樣總共移動次數為hantower(n-1)+1+hantower(n-1)。函式和測試如下:

eg.

>>> 

defhantower

(n):

if n == 1:

return

1else:

return (hantower(n-1) + 1 + hantower(n-1))

>>> hantower(1)

1>>> hantower(2)

3>>> hantower(3)

7>>> hantower(4)

15

2. 計算移動的步驟

計算步驟和計算次數演算法是一致的。

>>> def hantower(n,a,b,c):

if n == 1:

print(a+'->'+c)

else:

hantower(n-1,a,c,b)

print(a+'->'+c)

hantower(n-1,b,a,c)

>>> hantower(1,'a','b','c')

a->c

>>> hantower(2,'a','b','c')

a->b

a->c

b->c

>>> hantower(3,'a','b','c')

a->c

a->b

c->b

a->c

b->a

b->c

a->c

在上面的函式中hantower()中的a,b,c代表引數,引數沒有型別之分,但是在測試的時候,輸入的引數需要有型別之別,』a』,』b』,』c』代表字元。

遞迴之 漢諾塔

遞迴思想的概念 即將乙個複雜問題分解成一系列小的問題,並且這些小問題都具有相同的情形。此時可運用遞迴的思想來解決更易於理解 但並不一定是效率最高的哦 遞迴演算法有三個關鍵點 1 了解題意是否適用遞迴來解決 2 有明確的終止條件 通常是分解出來的一系列小問題裡最簡單的那種情況 3 隨著遞迴演算法的演進...

遞迴之漢諾塔

漢諾塔 time limit 1000 ms memory limit 65536 kib submit statistic problem description 漢諾塔 又稱河內塔 問題是印度的乙個古老的傳說。開天闢地的神勃拉瑪在乙個廟裡留下了三根金剛石的棒a b和c,a上面套著n個圓的金片,最...

遞迴之漢諾塔

問 如何移?最少要移動多少次?解法的基本思想是遞迴。假設有a b c三個塔,a塔有n塊盤,目標是把這些盤全部移到c塔。那麼首先將c塔作為中介,把a塔頂部的n 1塊盤移動到b塔,再把a塔剩下的n移到c,最後將a塔作為中介,把b塔的n 1塊盤移到c。每次移動多於一塊盤時,則再次使用上述演算法來移動。第一...