漢諾塔問題python詳解 《簡單分析》漢諾塔問題

2021-10-12 12:01:26 字數 1229 閱讀 2572

漢諾塔是乙個非常著名的遊戲,遊戲中將會有三根棍子,第一根棍子上有n個從大到小疊起來的盤子,遊戲的目標是將這n個從大到小疊起來的盤子放到第三根棍子上。每一次只允許移動乙個,而且大的盤子永遠在小的盤子的下面。這也是非常著名的遞迴入門題。

我們將通過呼叫三次遞迴函式來解決這個問題。

暫時不考慮**,只考慮解題。

先考慮n=3的情況。

t(n,first,temp,end)

n是盤子的個數,first是第一根棍子,temp是我們的輔助棍(也就是第二根),end是第三根棍子.

步驟如下:

1.t(n-1,first,end,temp)

2.t(1,first,temp,end)

3.t(n-1,temp,first,end)

總體來看,其意思如下:

第一步:將除最下面的盤子外的「所有」盤子移動到輔助棍。

第二步:將最下面的盤子移動到第三根棍子。

第三步:將輔助棍上的盤子移動到第三根棍子。

我們可以看到,第乙個t(2,a,c,b)就是在執行第一步操作,t(1,a,b,c)就是在執行第二步操作,t(2,b,a,c)就是在執行第三步操作。

即便是n大於3,也可以用這個圖的架構來解釋,只不過是分支多了而已。

如果你細心,你會發現,當我們把最大的那塊移動到c後,我們就可以當它不存在了,也就是我們需要移動的只是中間的n-1個,這樣總數量就少了乙個,然後繼續進行操作,把他們除了最後一塊其他全部重新全都移動到a(第一步),最後一塊移動到c(第二步),這樣就又少了乙個,我們需要移動的只剩下n-2個。如此迴圈。

如果你還是無法理解,建議看多幾次上圖。

**如下:

#include

void move(int n, char first, char temp, char end);

int main()

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

return 0;

void move(int n, char first, char temp, char end)

if (n == 1)

printf("%c --> %c\n", first, end);

else

move(n - 1, first, end, temp);

//第一步

move(1, first, temp, end);

//第二步

move(n - 1, temp, first, end);

//第三步

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...

python 漢諾塔問題

最近被漢諾塔的python 遞迴給迷暈,本想搞個程式除錯,但sublimetext用的不是很熟,參考了很多大佬的博文,需要總結下以防往後忘記 關於理解 流程,其實主要關注兩點 1 形參實參注意別搞混了 2 函式呼叫後都是要返回的,從哪個入口進去執行最後執行完程式是要返回回原來的入口,再執行時要注意開...

漢諾塔問題(python)

def hanoi n,a,b,c 將n個圓盤從a經過b移到c if n 0 圓盤數大於0 hanoi n 1,a,c,b 將n 1個圓盤從a經過c移到b print format a,c 將a上最底部的圓盤移到c hanoi n 1,b,a,c 將n 1個圓盤從b經過a移到c hanoi 3,a ...