漢諾塔遊戲的遞迴解析

2022-06-07 21:18:09 字數 2845 閱讀 4210

遞迴就是程式自己呼叫自己的過程。

本身理解遞迴的思想比較容易,舉乙個求階乘的例子:

def fact(n):

if n==1:

return 1

return n * fact(n - 1)

測試:

>>> fact(1)

1>>> fact(5)

120

實際上遞迴程式不可能一直遞迴迴圈下去,需要利用其它條件來結束遞迴迴圈。這裡求階乘的例子,就是當n==1時就結束遞迴迴圈。

這裡以fact(5)為例,看程式是如何進行遞迴執行的

===> fact(5) 

===> 5 * fact(4)

===> 5 * (4 * fact(3))

===> 5 * (4 * (3 * fact(2)))

===> 5 * (4 * (3 * (2 * fact(1))))

===> 5 * (4 * (3 * (2 * 1)))

===> 5 * (4 * (3 * 2))

===> 5 * (4 * 6)

===> 5 * 24

===> 120

可以看出程式從fact(5)遞迴到fact(1)結束。從上到下遞迴至結束,然後從下至上依次計算。

有三個柱子: a, b, c;

a 上有數量為n個的圓盤;

從a柱將數量為n個的圓盤拿到 c 柱上;

一次只能拿乙個圓盤,a,b,c 柱都可以利用;

無論在哪根柱子上,都是較大的圓盤永遠在較小圓盤下面。

為了方便後面的理解,這裡先說明幾個字母含義:

n:乙個標量,在下文中表示,第n個圓盤,n-1,第n-1個圓盤

n: 代表前n個圓盤, n-1 待變前n-1個圓盤;

a,b,c:分別表示三根柱子;

—>: 箭頭表示從...移動到...

玩漢諾塔遊戲可以分為三步:

將n-1個圓盤從 a 移到 b上;

將n圓盤從a 移到 c 上;

將n-1 個圓盤,從b 移到c 上。

玩漢諾塔就是不斷重複那三步,直到n-1=1

要將 n 個圓盤從 a 移到 c ,

則先將n-1個從a移到b,然後將n從a移動c,再將n-1從b移到c;

要將n-1個從a移到b,

則先將n-2個從a移到c,然後將n-1從a移動b,再將n-2從c移到b;

要將n-2個從a移到c,

則先將n-3個從a移到b,然後將n-2從a移動c,再將n-3從b移到c;

要將n-3個從a移到b,

則先將n-4個從a移到c,然後將n-3從a移動b,再將n-4從c移到b;

......

在遞迴到最後一層,n- (n-1)=1, 也就是 a 柱第乙個圓盤移向 b 還是 c 取決於n是奇數還是偶數。(代幾個數測試下就知道了)

注:要將n-k個從乙個柱子移到另乙個柱子,需要借助第三個空閒柱子

紅色部分遞迴路徑,假設其為遞迴1號路線,在其下面還有其它遞迴分支(綠色表示)。等紅色的從上往下遞迴到底後,程式從底下,往上開始計算,遇到綠色則開始遞迴,等綠色遞迴完後繼續計算上一層的。

程式一開始的遞迴沿著紅色一直遞迴到最後一層(實際圓盤中最上面的那個)不再進行遞迴,直接開始搬運圓盤。然後執行最後一層的剩餘步驟(黑色,紅色),最後一層執行完,

等計算完,紅色部分遞迴1號路線

程式執行n(a)->c,

然後開始藍色部分的遞迴路徑(稱其遞迴2號路線),遞迴2號路線同1號路線一樣也有許多遞迴支路。

為幫助理解,下面是乙個路線圖,挺醜的,湊合看。。

如果單純值拿紅色遞迴1號路線(不包括其遞迴支線),其實其和上面的遞迴階乘的例子是一樣的。但是漢諾塔這個有了許多遞迴支線,就感覺複雜了許多。同時也可能因為從a->b, a->c, b->c, a->c,a-b...這三個字母混去混來的,腦袋記不住它們關係了,容易犯渾。但是你像那樣將遞迴推導列出來就容易明白了。

# python

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

if n == 1:

print(f" --> ")

else:

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

print(f" --> ")

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

move(4,'a', 'b', 'c')

#include // c

void move(int, char, char, char);

void move(int n, char x, char y, char z)

else

}int main()

參考:

遞迴函式

原文: 漢諾塔遊戲的遞迴解析

漢諾塔遊戲攻略 遞迴

那麼我們怎麼玩呢?其實是有規律性的遊戲,並且滿足一定的遞迴性。我們把放盒子的柱子設定為x,其餘兩根分別設定為y,z,要想讓盒子從x移動到z上,並且成金字塔形擺放 第一步 如果只有乙個的時候,直接從x移動到z上即可,如果n個呢 那先將這n 1個借助z移動到y上 第二步 然後將最後乙個直接移動到z上,這...

漢諾塔 遞迴

個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...

遞迴漢諾塔

遞迴問題 遞迴要有三個要素 1.遞迴結束條件 2.遞迴結束時的處理 3.抽取重複的邏輯,剝離外殼 重點都在這一步 漢諾塔問題 把圓盤從下面開始按大小順序重新擺放在另一根柱子上。且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。首先,要搞這個編碼得要知道漢諾塔的解題思路 1.把a塔上...