Skip to content

Latest commit

 

History

History
56 lines (44 loc) · 1.78 KB

symbol-different.md

File metadata and controls

56 lines (44 loc) · 1.78 KB

這章練習用符號系統做微分的解析解。 之前有做過數值解,這裡是用符號解析解。 首先要定義方程式各元素, 像 a+b 表達 (+ a b)

練習 2.56 的 expontential 有寫出來, 但另一部份不知道要幹麻。 exp 是用 **a^b 表達成 (** a b) 。 但沒有處理 (** x 3) 的情況, 只能處理 base 為常數的情況。

sicp 一開始給了一個微分函數, 用到 sum? make-sum addend augend 等函數, 而無關低階資料結構。 後來要我們改低階結構,

原本 sum 是 (+ a b) ,只能有二個部份, 所以多個數的加法就是 (+ a (+ b c))

後來要我們改成可以寫 (+ a b c) , 可以接受多元加法, 且要求不能改動 deriv 原本的內容。 我是改成讓 (+ a b c) 視為 a(+ b c) 相加。

最後要我們改成 (a + b + c) , 一樣不改 deriv 內容。 先做無乘法優先規則的,之後再做有的。

無優先規則蠻簡單的, 直接當作第一個元素和其它元素的操作。 要加優先規則,我實作了 split-sum 函數, 只以加法分割表達式,把一個表達式分割成二部份。

sum 是調用 split-sum 完成的, product 則是直接切星號就可以, 因為乘法優先於加法。

另外一個問題是要判斷 (3 * 4 + 5) 為加法, 因為應該是 ((3 * 4) + 5) , 是一個表達式和另一個數字的和。 就要先測有沒有 + , 有的話就必定是和,因為乘法要先算, 就是乘法表達式和另一個的和。

'(a * b + b + c) ;(a * b) + b + c
'(a + b * c + d) ;(a + 

途中有一個問題,是裝箱拆箱的問題。 如果一個表達式只有一個元素, 像 ((3) + 4)(3) , 不能當成 sum 或 product 處理, 不然會噴 error。