01 · 自然數:零、後繼與遞迴
自然數:零、後繼與遞迴¶
把每個自然數表示成零或某個數的後繼,直接由兩種情形實作相等與加法。
閱讀本章前
你已知道運算子會呼叫特殊方法,裝飾器會在方法回傳後記錄訊息。
完成本章後,你可以
- 用自己的話說明「自然數:零、後繼與遞迴」中的數學定義
- 指出定義在 Python 資料中的表示方式
- 依據實際實作預測一段小型執行過程
數學定義
零與後繼是皮亞諾公理的出發點;`n + 0 = n` 與 `n + S(m) = S(n + m)` 是加法的遞迴定義,不是新的公理。
資料表示
`pre=None` 表示零,`pre=n` 表示 `S(n)`。所以 2 儲存成 `S(S(0))` 的前驅鏈,而不是欄位中的 Python 整數 2。
Python 實作
`0` / `S(n)` → `NaturalNumber.pre`; recursive addition → `__add__`
與本章一起閱讀的實作與測試
數學定義
數學定義¶
零與後繼是皮亞諾公理的出發點;n + 0 = n 與 n + S(m) = S(n + m) 是加法的遞迴定義,不是新的公理。
資料表示
資料表示¶
pre=None 表示零,pre=n 表示 S(n)。所以 2 儲存成 S(S(0)) 的前驅鏈,而不是欄位中的 Python 整數 2。
Python 實作
Python 實作¶
__eq__ 區分零與後繼並遞迴比較前驅;__add__ 的兩個分支逐字對應加法的基底情形與遞迴式。
本課程使用的精確對應關係:
執行過程
執行過程¶
計算 2 + 2 時,右運算元逐步縮小到零。呼叫回傳時先記錄基底情形,再記錄兩層遞迴。
執行前預測
執行前寫出基底日誌、最後一條遞迴日誌與最終值。
實驗 · 自然數:零、後繼與遞迴
尚未執行
⌘ / Ctrl + Enter
輸出
請先寫下預測,再執行。
用測試核對
用測試核對¶
測試分別命名零不是後繼、後繼的單射性與兩條加法定義。有限測試不能取代歸納證明。
適用範圍
適用範圍¶
一元前驅鏈能清楚顯示結構,但時間與空間隨數值增加,只適合小輸入。