這章練習用符號系統做微分的解析解。
之前有做過數值解,這裡是用符號解析解。
首先要定義方程式各元素,
像 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。