一開始list->tree會呼叫partial-tree,而後者會將每次傳入的表分成兩部分,然後組合成乙個平衡樹。中間運用了迭代的技巧,而這是讓眾多樹枝產生的源泉。如果我們對前面的表』(1 3 5 7 9 11)做計算,返回的結果將會是:
(5 (1 () (3 () () ) ) (9 (7 () () ) (11 () () ) ) )
其中的空表則表示的左、右沒有子樹。
畫出產生的樹我就不再這裡列出了,最終結果和圖2-16中的最後乙個類似,但有區別:將圖中的1換成3,然後在1的左子樹上為空表,右子樹則為3。
而b小題中的複雜度,每次遇到乙個節點,該函式都會用一次make-tree來構造,後者的複雜度是1,因此對於有n個結點的樹來說,這個函式的複雜度就是n。
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...
SICP練習 17 練習1 23
練習1.23 首先我們按照題目要求來寫出相應的next函式,然後再修改find divisor函式。define next x if x 2 3 n 2 define find divisor ntest divisor cond square test divisor n n divides?te...