如題目中所說,傳入給successive-merge的引數是乙個有序的集合。而這個函式將通過不斷的歸併得到最終的乙個元素。如果傳入的集合為0,也就是說返回的表應該是空表。如果傳入的集合為1,那麼將傳入的集合的car部分取出來,這就是huffman樹了。而如果傳入的集合大於1,那麼就要多做些處理了。因為集合已經做好了排序,這裡所謂的排序自然就是按照的權重了。因此最前面的元素其權重也最小。如題中所說,這裡要呼叫make-code-tree來得到新的樹。當然了,到了這一步應該將用掉的這兩個元素從原來的集合中刪除掉。然後將新的樹和遺留下來的樹通過adjoin-tree結合起來,再作為引數傳給我們所寫的這個函式,很明顯,這是乙個遞迴的過程。
(define
(successive-merge ordered-set)
(cond
((=0(length ordered-set)) 『())
((=1
(length ordered-set))
(car ordered-set))
(else
(let
((new-sub-tree
(make-code-tree
(car ordered-set)
(cadr ordered-set)))
(remained-ordered-set
(caddr ordered-set)))
(successive-merge
(adjoin-set new-sub-tree remained-ordered-set))))))
這裡是用了乙個remianed-ordered-set來間接的刪掉用過的2個元素。 SICP練習 96 練習2 69
如題目中所說,傳入給successive merge的引數是乙個有序的集合。而這個函式將通過不斷的歸併得到最終的乙個元素。如果傳入的集合為0,也就是說返回的表應該是空表。如果傳入的集合為1,那麼將傳入的集合的car部分取出來,這就是huffman樹了。而如果傳入的集合大於1,那麼就要多做些處理了。因...
SICP練習 7 練習1 11
這種題目太像是數學題目了,不過拿到程式設計上又有一些的難度。我們先根據題目中的條件,寫出類似於第 25頁最下面的變換規則。我們先列出如下內容 a f n 1 f 2 f 3 f 4 f 5 b f n 2 f 1 f 2 f 3 f 4 c f n 3 f 0 f 1 f 2 f 3 於是繼而得出下...
SICP練習 12 練習1 18
練習1.8 和前兩題一樣,依舊是只能用對數步數。而且這個迭代過程要基於加 加倍和折半運算。這乙個習題要用到前面的函式,因此最好的做法是,每次都將寫好的 儲存起來。load test1.18.scm 這行 可以用來載入 而儲存可以用c x,c w。以下是該題的 這次我們寫成塊結構 define x y...