漢諾塔問題深度剖析(python實現)

當我們學習一門編程語言的時候,都會遇到遞歸函數這個問題。而學習遞歸的一個經典案例就是漢諾塔問題。通過這篇文章,觀察移動三個盤子和四個盤子的詳細過程,您不僅可以深刻的了解遞歸,也更加熟悉了漢諾塔的游戲的玩法。

更好的閱讀體驗可訪問 這里。

規則

有a、b、c三個柱子,a從上到下,從小到大有n個盤子。要求把a上所有盤子移動到c,一次只能移動一個盤子,且大盤子不能放小盤子上。

方法

  1. 當a上有一個盤子時,直接把該盤子移動到c。
  2. 當a上有n個盤子時(n > 1):

    先把a上n-1個盤子移動到b,
    再把a上最后一個盤子移動到c,
    再把b上所有盤子移動到c。

代碼實現

def mov(n,a,b,c):if n == 1:# 如果a上只有一個盤子,直接把a移動到cprint(a,'-->',c)else:# 先把a上的n-1個盤子移動到bmov(n-1,a,c,b)# 再把a上最后一個盤子移動到cmov(1,a,b,c)# 最后把b上所有盤子(n-1個)移動到cmov(n-1,b,a,c)num = abs(int(input('一共有幾個盤子:')))
print('\n移動步驟為:')
mov(num,'A','B','C')

3個盤子的實例

  1. 先把a上的2個移動到b

    先把a上的1個移動到c
    再把a上最后1個移動到b
    再把c上僅有的一個移動到b

  2. 再把a上最后一個移動到c
  3. 再把b上的兩個移動到c

    先把b上的一個移動到a
    再把b上最后一個移動到c
    再把a上僅有的一個移動到c

也就是:

A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

4個盤子的實例

  1. 先把a上的三個移動到b(套用上面三個盤子的情況,只不過之前是移動到c,現在是b)

    先把a上的2個移動到c

    先把a上的1個移動到b
    再把a上最后1個移動到c
    再把b上僅有的一個移動到c

    再把a上最后一個移動到b

    再把c上的兩個移動到b

    先把c上的一個移動到a
    再把c上最后一個移動到b
    再把a上僅有的一個移動到b

  2. 再把a上最后一個移動到c
  3. 再把b上的3個移動到c(還是第一步的思路,只是換了個柱子)

    先把b上的2個移動到a

    先把b上的1個移動到c
    再把b上最后1個移動到a
    再把c上僅有的一個移動到a

    再把b上最后一個移動到c

    再把a上的兩個移動到c

    先把a上的一個移動到b
    再把a上最后一個移動到c
    再把b上僅有的一個移動到c

    也就是:

    A --> B
    A --> C
    B --> C
    A --> B
    C --> A
    C --> B
    A --> B
    A --> C
    B --> C
    B --> A
    C --> A
    B --> C
    A --> B
    A --> C
    B --> C

這樣就清晰的看出移動的各個步驟。

總結

再反過來分析一下,當移動一個盤子的時候只需一步就能完成,對應于代碼中的

    if n == 1:# 如果a上只有一個盤子,直接把a移動到cprint(a,'-->',c)

當移動兩個盤子的時候,得需要三步才能完成。例如:把a上的兩個盤子移動到c

  1. 先把a上的1個移動到b
  2. 再把a上最后1個移動到c
  3. 再把b上僅有的一個移動到c

當移動三個盤子的時候,就可以分解成先移動兩個盤子,再移動一個盤子。
當移動四個盤子的時候,就可以分解為先移動三個盤子,再移動一個盤子。依次類推。。

可見當移動兩個或兩個以上個數盤子的時候,都只需要三步就可以完成。其中每一步又可以分解為三步,直到只剩下一個盤子的情況。對應于代碼中的

    else:# 先把a上的n-1個盤子移動到bmov(n-1,a,c,b)# 再把a上最后一個盤子移動到cmov(1,a,b,c)# 最后把b上所有盤子(n-1個)移動到cmov(n-1,b,a,c)

所以,漢諾塔問題,你了解了嗎?

參考:python下實現漢諾塔

轉載于:https://www.cnblogs.com/sfriend/p/10862230.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251776.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS-QQ臨時對話、QQ群申請跳轉

QQ 臨時對話 NSString *qq [NSString stringWithFormat:"mqq://im/chat?chat_typewpa&uin%&&version1&src_typeweb","這是是QQ號碼"];NSURL *urlQQ [NSURL URLWithString:qq];[[UIApplication sharedApplication] openURL:urlQQ]; QQ 申…

[luoguP2331] [SCOI2005]最大子矩陣(DP)

傳送門 orz不會做。。。 一個好理解的做法(n^3*k): 分n1和n2兩種情況考慮。 n1時,預處理出前綴和sum[]。 設f[i][j]為到達第i格,已經放了j個子矩陣的最大和, 那么每次先把f[i][j]的值設為f[i-1][j]&#xf…

想要去阿里面試?你必須得跨過 JVM 這道坎!

概述 很多人想要到阿里巴巴、美團、京東等互聯網大公司去面試,但是現在互聯網大廠面試一般都必定會考核JVM相關的知識積累和實踐經驗,畢竟線上系統寫好代碼部署之后,每個工程師都必須關注JVM相關的東西,比如OOM、GC等問題. 所以一…

醫學知識圖譜一

大綱 知識自動提取技術 醫學知識融合 醫學知識推理 轉載于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一個div里,列表樣式圖片進行float,實現水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">產品名稱</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

團隊開發git使用各種問題

參考:https://www.cnblogs.com/schaepher/p/4933873.html 問題-3:保持github上項目干凈&#xff0c;對于在不同機器上運行會不同的文件不予維護(如.idea/workspace.xml) 建議:對于項目輸出在項目目錄中的文件不予維護 對于IDE自動生成且與項目所在目錄有關的文件不予維護 將這些…

filebeat 亂碼

查看 文件的類型 [rootelk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators 如果命令返回結果說明改日志為utf-8&#xff0c;則logstash配置文件中charset設置為UTF-8 如果命令…

團隊編程項目代碼設計規范(爬取豆瓣電影top250)

基本格式 縮進 使用4個空格進行縮進 行寬 每行代碼盡量不超過80個字符 理由&#xff1a; 這在查看side-by-side的diff時很有幫助方便在控制臺下查看代碼太長可能是設計有缺陷換行 Python支持括號內的換行。這時有兩種情況。 第二行縮進到括號的起始處foo long_function_name(v…

程序員的浪漫

程序員的浪漫 馬上就到520了&#xff0c;各位小伙伴想好了準備什么禮物送個自己的另一半呢&#xff1f;還沒想好的注意啦&#xff01;&#xff01;現在還有機會&#xff0c;今天給大家分享一些程序員的浪漫創意禮物&#xff0c;希望你可以從中找到一些靈感。 One Link&#xff…

14-1 部署項目

1313轉載于:https://www.cnblogs.com/ZHONGZHENHUA/p/9011671.html

The listener supports no services

$ lsnrctl start 報錯提示: The listener supports no services The command completed successfully 如圖所示&#xff1a; 這樣啟動后遠程連接會報錯&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 問題原…

Luogu P2577 [ZJOI2005]午餐

一道貪心類背包DP的好題 首先發現一個十分顯然的性質&#xff0c;沒有這個性質整道題目都難以下手&#xff1a; 無論兩隊的順序如何&#xff0c;總是讓吃飯慢的人先排隊 這是一個很顯然的貪心&#xff0c;因為如果讓吃飯慢的排在后面要更多的時間至少沒有這樣優 因此我們先按吃…

SEO【總結】by 2019年5月

2019獨角獸企業重金招聘Python工程師標準>>> 關鍵點&#xff1a; 1、代碼 1.1、seo前端代碼&#xff1a;基于Html代碼的SEOherf&#xff1a;https://my.oschina.net/u/2862573/blog/3030664 注意的要點&#xff1a; h1&#xff0c;h2的內容很關鍵 網頁的壓縮、靜態化…

Linux 系統的啟動順序

第一步&#xff1a;加載BIOS當你打開ia計算機的電源&#xff0c;計算機會首先加載計算機主板的BIOS信息&#xff0c;因為它包含了CPU的相關信息&#xff0c;設備啟動順序[安裝系統的U盤啟動順序]&#xff0c;內存信息&#xff0c;時鐘信息&#xff0c;PnP特性等等&#xff0c; …

Oracle數據庫 查看表是否是 索引組織表的方法

1. 最近在工作過程中發現 一個表插入很慢 以為是索引組織表, 所以一直有點糾結 但是發現 產品里面是沒有IOT的 于是找了下公司的OCP 問了下 如何查看 就是 user_tables 視圖里面的一個字段. 見圖: 轉載于:https://www.cnblogs.com/jinanxiaolaohu/p/9018037.html

Windows server 2016 搭建RDS服務

計算機的更新換代太快&#xff0c;新購置的計算機沒幾年便覺得運行速度越來越慢&#xff0c;尤其是在運行一些比較大的應用程序是&#xff0c;用戶總是抱怨運行速度太慢或者總是死機等問題。如果要更換新的計算機&#xff0c;又得不到領導的批準&#xff0c;因此對于企業來說&a…

π 的定義(極限)

圓周率&#xff0c;周長&#xff08;2πr&#xff09;與直徑&#xff08;2r&#xff09;的比值。在名稱上&#xff0c;是通過計算命名的。 1. 劉徽割圓與圓周率 π 通過圓內接正多邊形的周長來計算圓周長&#xff0c;是三世紀中期我國魏晉時代的數學家劉徽的光輝思想。 對于圓內…

前端開發瀏覽器兼容問題

csshack 1234567我很少使用hacker的&#xff0c;可能是個人習慣吧&#xff0c;我不喜歡寫的代碼IE不兼容&#xff0c;然后用hack來解決。不過hacker還是非常好用的。使用hacker我可以把瀏覽器分為3類&#xff1a;IE6 &#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 chr…

springboot2.0 多數據源整合問題 At least one JPA metamodel must be present! ??at

2019獨角獸企業重金招聘Python工程師標準>>> 數據源代碼&#xff1a; 第一個讀取配置文件代碼&#xff1a; package com.datasource;import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.sp…

好書推薦

阿爾花剌子模:代數學. 喬治波利亞:怎樣解題:數學思維的新方法. Anany Levitin:算法設計與分析基礎.轉載于:https://www.cnblogs.com/mtl6906/p/7625290.html