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

更新於 發佈於 閱讀時間約 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
留言分享你的想法!
avatar-img
小猴工程師
1會員
23內容數
小猴工程師的其他內容
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.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
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