一切從觀察開始:河內塔問題與演算法設計

更新 發佈閱讀 3 分鐘

演算法的本質

「演算法是什麼?」這個問題的答案存在於生活的各個角落。廚師將食材轉化為佳餚的食譜、音樂家將樂譜演繹成動人旋律的過程,甚至是孩童將廢紙摺成紙飛機的步驟,都隱含著演算法的核心精神——在特定限制下,將輸入轉換為輸出的系統性流程

當我們用程式設計師的角度理解,演算法便是將問題的輸入(如程式指令)轉化為預期輸出(如運算結果)的明確步驟。

展示了不同領域的演算法實踐:

執行者 輸入 輸出

廚師 食材 美食

演奏家 樂譜 音樂

程式設計師 程式輸入 程式輸出


河內塔問題的啟示

這個古老遊戲完美體現了演算法設計的精髓。

問題情境如下:

將左柱上的碟子全數移至右柱,需遵守:

  1. 每次只能移動一個碟子
  2. 只有柱頂的碟子可被移動
  3. 大碟不可置於小碟之上

通過觀察三碟案例,我們發現需7個步驟完成。

這引發關鍵問題:

「n個碟子時,最少需要多少步?」


從觀察到數學模型

建立數學符號 Tn 表示n碟所需步數,並通過小案例建立數列:

raw-image

敏銳觀察可發現隱藏規律:

raw-image

我們以 T(n) 表示移動 n 個碟子所需的最少步數,並透過小案例建立數列:

  • T(1) = 1
  • T(2) = 3
  • T(3) = 7

觀察發現: T(n) = 2T(n-1) + 1

這即是遞迴解法的核心策略:

  1. 先將前 n-1 個碟子移至中柱(需 T(n-1) 步)。
  2. 移動最底層碟子至右柱(1 步)。
  3. 再將 n-1 個碟子移至右柱(再 T(n-1) 步)。

河內塔問題的遞迴解法實作

def hanoi(n, source, target, auxiliary):
"""
遞迴解河內塔問題
:param n: 碟子數量
:param source: 來源柱子
:param target: 目標柱子
:param auxiliary: 輔助柱子
:return: 總移動次數
"""
if n == 0:
return 0

# 移動前n-1個碟子到輔助柱
count = hanoi(n-1, source, auxiliary, target)

# 移動最底層碟子
print(f"移動碟子 {n}{source}{target}")
count += 1

# 移動n-1個碟子到目標柱
count += hanoi(n-1, auxiliary, target, source)

return count

# 測試3個碟子
total_steps = hanoi(3, 'A', 'C', 'B')
print(f"\n總移動次數:{total_steps}")
  • hanoi(n-1, source, auxiliary, target):先移動前n-1個碟子到輔助柱
  • 移動第n個碟子到目標柱
  • hanoi(n-1, auxiliary, target, source):最後移動n-1個碟子到目標柱

執行結果:

raw-image

總結

河內塔問題揭示演算法設計的關鍵技巧:

  1. 觀察模式:從具體案例發現數列規律
  2. 建立遞推:將複雜問題分解為子問題
  3. 數學建模:用公式精確描述問題關係
  4. 歸納證明:確保解法的普遍正確性


這個過程體現了「從觀察出發」的核心精神。就像摺紙飛機需要逐步疊加技巧,演算法設計也需要透過系統性觀察與邏輯推演,將直覺轉化為可執行的計算步驟。這種思維模式不僅適用於經典問題,更是解決各類計算問題的基礎框架。

如果你有興趣進一步學習,請留言告訴我或留言與我分享~~~~



留言
avatar-img
小猴工程師
2會員
31內容數
以工程師視角拆解技術與生活的連結。專長 DevOps、AI 與區塊鏈,把艱深的技術轉化為易懂的故事。 文章主題橫跨技術筆記、實作教學與個人經驗分享。 寫作理念:讓每個想靠技術改變生活的人,都能在這裡找到啟發。
小猴工程師的其他內容
2025/04/15
這篇文章提供教學,如何使用 Python 和 Pandas 函式庫將 Elasticsearch 的 JSON 資料(透過 Elasticdump 匯出)轉換成 Excel 可讀取且支援繁體中文的 CSV 檔案,並解決常見的中文編碼問題。
2025/04/15
這篇文章提供教學,如何使用 Python 和 Pandas 函式庫將 Elasticsearch 的 JSON 資料(透過 Elasticdump 匯出)轉換成 Excel 可讀取且支援繁體中文的 CSV 檔案,並解決常見的中文編碼問題。
2025/03/21
本文介紹 VB.NET 的 If...Else 和 Select Case 條件判斷結構,包含語法、範例及適用情境。If...Else 適合多變數與複雜邏輯,Select Case 則適用於單一變數的多值判斷,語法簡潔且效能較佳。文章並比較其效能、靈活性與可讀性,幫助選擇最佳控制結構。
Thumbnail
2025/03/21
本文介紹 VB.NET 的 If...Else 和 Select Case 條件判斷結構,包含語法、範例及適用情境。If...Else 適合多變數與複雜邏輯,Select Case 則適用於單一變數的多值判斷,語法簡潔且效能較佳。文章並比較其效能、靈活性與可讀性,幫助選擇最佳控制結構。
Thumbnail
2025/03/20
本文介紹如何使用 kubeadm 手動更新 Kubernetes 憑證,包含憑證有效期限、更新步驟、相關指令、重新啟動 Kubernetes 組件方法,以及最佳實踐,例如定期檢查憑證、備份憑證與配置、測試更新流程和監控 Kubernetes 組件狀態等。
Thumbnail
2025/03/20
本文介紹如何使用 kubeadm 手動更新 Kubernetes 憑證,包含憑證有效期限、更新步驟、相關指令、重新啟動 Kubernetes 組件方法,以及最佳實踐,例如定期檢查憑證、備份憑證與配置、測試更新流程和監控 Kubernetes 組件狀態等。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.4 函算語法 1.4.1 語法範疇理論導論 七 指派範疇是第一步, 第二步是設定推導規則。 推導規則的作用是對某一給定的表式63 進行判定,看它是否一個貫通的表式(或詞構)。就上述英語例句而言,我們只需一個簡單的單向通則 (general rule)﹕6
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 1.2.6 熱的傳導 1.2.7 十九世紀的尾聲 三 必須說一下波希米亞數學家/邏輯學家/哲學家/神學
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動 1.2.6熱的傳導 二 傅立葉認為他的結果對任一函數皆有效,並將函數定義為 (FF) 在一般情況下,函數
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5弦的振動  七 雖然論爭沒有得出任何定論,但對函數概念的演化卻影嚮頗深。 在這次歷時多年的論爭中,函數概念得以擴大而包括
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 五 特朗貝爾依循當時數學界對函數的普遍理解,視「函數」為任一分析式。 但這時的歐拉宣稱函數不必是正常意義下的
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 五 特朗貝爾依循當時數學界對函數的普遍理解,視「函數」為任一分析式。 但這時的歐拉宣稱函數不必是正常意義下的
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 三 1755年,歐拉改變了主意,在《微分學原理》(Institutiones calculi differen
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法 1.2.5 弦的振動 三 1755年,歐拉改變了主意,在《微分學原理》(Institutiones calculi differen
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  二 前面說過,牛頓關心的不是抽象的數學問題,他要解決的是天體運動的問題。他知道,假如他擁有該天體在任何一刻的瞬速數據,他便能夠從質量
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 1.2.4 微積分的記法  二 前面說過,牛頓關心的不是抽象的數學問題,他要解決的是天體運動的問題。他知道,假如他擁有該天體在任何一刻的瞬速數據,他便能夠從質量
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 一 因此打從輪廓的浮現,萌牙狀態的函數概念是一個幾何圖象。 有趣的是,兩個世紀之後,即公元十六世紀,歐洲文藝復興如日中天,法國數學家及哲學家勒內‧笛卡兒承襲
Thumbnail
1.0 從函數到函算語法 1.2 函數概念小史 1.2.1 中譯的來源 1.2.2 一個速度問題 1.2.3 幾何的方法 一 因此打從輪廓的浮現,萌牙狀態的函數概念是一個幾何圖象。 有趣的是,兩個世紀之後,即公元十六世紀,歐洲文藝復興如日中天,法國數學家及哲學家勒內‧笛卡兒承襲
Thumbnail
目錄 序 導論: 一個西方觀點的評述 1.0 從函數到函數算法 ......1.1 句子成份
Thumbnail
目錄 序 導論: 一個西方觀點的評述 1.0 從函數到函數算法 ......1.1 句子成份
Thumbnail
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
Thumbnail
這篇文章,會帶著大家複習以前學過的前綴和框架, 並且以區間和的概念與應用為核心, 貫穿一些相關聯的題目,透過框架複現來幫助讀者理解這個演算法框架。 前綴和 prefix sum框架 與 區間和計算的關係式 接下來,我們會用這個上面這種框架,貫穿一些同類型,有關聯的題目 (請讀者、或觀眾
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News