日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

汉诺塔python代码解释_Python-汉诺塔原理分析

發(fā)布時間:2024/5/8 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汉诺塔python代码解释_Python-汉诺塔原理分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在“廖雪峰的官方網站”學習Python,遇到漢諾塔遞歸問題百思不得其解,先是百度了漢諾塔原理,然后查看了別人的寫的文章,通過整理匯總,希望能夠幫助其他人理解。

漢諾塔原理:(來源于百度百科)

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

邏輯推理

圖片:![](https://s4.51cto.com/images/blog/201801/20/7746b0650de5e627d7efc396a8749d2a.jpg?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

推理邏輯:

首先有3個柱子(A B C) ,A柱子有N個圓盤,假如我們圓盤按照L1-Ln表示,要將A中圓盤移動到其他柱子中去,假如為C,需要幾步。規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

假如n=1

則圓盤為L1 ,只需將圓盤從A→C,共一步

假如n=2

則圓盤為L1,L2 ,則需要將先將L1從A→C,然后將L2從A→B,最后將L1從C→B,共3步。

假如n=3

則圓盤為L1,L2 ,L3, 先將L1從A→C,然后將L2從A→B,L1從C→B,然后將L3從A→C,然后將L1從B→A,將L2從B→C,再將A→C。

...

簡單思考:

上面只是一個移動過程,如果沒有圖片很難理解 ,我們可以簡單思考下,將所有盤片看成L1-L(n-1)和Ln兩個部分。如果有n個盤片需要移動,則:

# 子目標1:將前n-1個盤子從a移動到b上

# 子目標2:將最底下的最后一個盤子從a移動到c上

# 子目標3:將b上的n-1個盤子移動到c上

實際上n-1個圓盤本身又是一個遞歸,一直可以分解成n=1為止。

下面貼上代碼

# 漢諾塔思想筆記

# 認識漢諾塔的目標:把A柱子上的N個盤子移動到C柱子

# 遞歸的思想就是把這個目標分解成三個子目標

# 子目標1:將前n-1個盤子從a移動到b上

# 子目標2:將最底下的最后一個盤子從a移動到c上

# 子目標3:將b上的n-1個盤子移動到c上

# 然后每個子目標又是一次獨立的漢諾塔游戲,也就可以繼續(xù)分解目標直到N為1

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

if n == 1:

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

else:

move(n-1, a, c, b)# 子目標1

move(1, a, b, c)# 子目標2

move(n-1, b, a, c)# 子目標3

n = input('enter the number:')

move(int(n), 'A', 'B', 'C')

? 代碼解釋如下“

/**

我把3個盤子的漢諾塔全部通過代碼演示,按縮進原則,每一個縮進即進一個遞歸函數,每打印一次即中止當前遞歸,也就是每個print

說明:

1.n = 3, n = 2, n = 1是每次執(zhí)行if(n == 1)的結果,這里就不寫判斷了,相信童鞋們也能看懂,也就是n不等與1時就減1進入遞歸

2.請注意a,b,c柱每次進入函數的順序,不要被形參帶錯路了,看準每次函數參數的實參

**/

move(3, "a", "b", "c")

n=3:

//開始從a上移動n-1即2個盤子通過c移動到b,以騰出c供a最后一個盤子移動

move(2, "a","c","b")

n=2:

//開始進行n=2的一個遞歸,把當前a('a')柱上的n-1個盤子通過c('b')移動到b('c')

move(1, "a", "b", "c")

n=1:

//n=2的第一個遞歸完成,打印結果,執(zhí)行當前子函數剩余代碼

print("a", "->", "c")

move(1, "a", "c", "b")

n=1:

print("a", "->", "b")

move(1, "c", "a", "b")

n=1:

print("c", "->", "b")

//到這里完成了a柱上面的n-1即是2個盤子的移動

//開始把a柱上最后一個盤子移動到c柱上

move(1, "a", "b", "c")

n=1:

print("a", "->", "c")

//到這里完成移動a柱上的最后一個盤子到c柱上

move(2, "b", "a", "c")

n=2:

//開始進行n=2的第二個遞歸,即把當前b('b')的盤子(n-1個)通過a('a')移動到c('c')上

move(1, "b", "c", "a")

n=1:

//n=2 的第二個遞歸完成,打印結果并執(zhí)行當前子函數的剩余代碼

print("b", "->", "a")

move(1, "b", "a", "c")

n=1:

print("b", "->", "c")

move(1, "a", "b", "c")

n=1:

print("a", "->", "c")

//到這里把b上的盤子通過a移動到c,

//整個代碼執(zhí)行完畢,漢諾塔移動完成

好吧,我承認我不會用這個博客,好多格式都沒有表現出來。

? ?你們可以參考以下幾個地方:

? ?百度百科-漢諾塔原理:https://baike.baidu.com/item/%E6%B1%89%E8%AF%BA%E5%A1%94/3468295?fr=aladdin

? ?廖雪峰的官方網站-Python:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756044276a15558a759ec43de8e30eb0ed169fb11000

? Python技術交流:http://bbs.fishc.com/thread-61965-1-1.html?

? ?遞歸經典案例分析:http://blog.csdn.net/hikobe8/article/details/50479669

總結

以上是生活随笔為你收集整理的汉诺塔python代码解释_Python-汉诺塔原理分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。