調整我的編碼方法,變成先遍歷左側樹葉,如果左側沒有就遍歷右側樹,這樣比我之前寫的需要對比每個樹的symbol,來找到左邊樹要效率高些。
原來的方法
(define (encode-symbol message tree)
(cond (
(leaf? tree)
null)(
(element-of-
set? message (symbols (left-branch tree)))
(cons 0
(encode-symbol message (left-branch tree)))
)((element-of-
set? message (symbols (right-branch tree)))
(cons 1
(encode-symbol message (right-branch tree)))
)(else
(error "bad bit -- chosse-branch" message)))
)
參考某大神的寫法
(define (encode-symbol symbol tree)(if
(leaf? tree)(if
(eq? symbol (symbol-leaf tree)
) '(
)#f)
(let
((left-result (encode-symbol symbol (left-branch tree)))
)(if left-result
(cons 0 left-result)
(let
((right-result (encode-symbol symbol (right-branch tree)))
)(if right-result
(cons 1 right-result)
#f))))))
然後我們計算最頻繁符號和最不頻繁符號的遍歷過程,如果有n個符號,則最不頻繁的符號遍歷n次樹節點,最頻繁的節點會遍歷整個樹節點,樹節點的個數為2n-1個,所以每次會遍歷2n-1次,如果n個符號,將會遍歷n*(2*n-1)次。 電腦程式的構造和解釋 練習題1 44
平滑函式的公式為 f s x f x dx f x f x dx 3f s x f x dx f x f x dx 3 fs x f x dx f x f x d x 3他的幾何意義應該是將每個點的導數,變化率變小。說簡單點就是函式那塊曲線彎度比較大,加上這個函式就會減小他的彎度,直到他無限接近於一...
電腦程式的構造和解釋 練習題2 19
lang racket define no more?coin values null coin values define except first denomination coin values cdr coin values define first denomination coin va...
電腦程式的構造和解釋 練習題2 61
跟element of set?一樣的道理,當元素大於當時的set表時,就說明元素根本不在這個表裡,所以將元素直接插入到當時表的前面就可以了。最壞的情況還是把錶迴圈了一遍,最好的情況是只迴圈了一次,這樣平均的步數就是n 2次。define adjoin set x set cond null set...