練習1.43
我不想一開始就將結果貼出啦,而是通過敘述自己的思考來完成這篇部落格。上一題中我在紙上寫下「傳入2個過程並返回1個過程」,事實證明挺有效的,於是這次我也依舊這麼做了。
repeated
需要傳入乙個過程和乙個數字,這個數字決定了這個過程的執行次數。repeated還要返回1個過程,而這個過程又要傳入乙個數字,這個數字又將通過前面傳入的過程來運算。確實挺繞的。
一開始對於決定這個過程的執行次數這一部分,我想參照練習1.41,還define了乙個過程。但不知道怎麼把這個過程寫入repeated中。於是我將這個過程按如下格式寫入repeated中了,編譯器報錯說這種形式非法。
(define repeated
(define r
(lambda (x)
......
(lambda ......
而後我不再企圖單獨列出這個要讓過程執行多次的部分,而是先暫時將問題簡單化。即便是只能做乙個唯一的普通的運算也好。
(define repeated
(lambda (f a)
(lambda (b)
(if (= a 2)
(f (f b))
(f b)))))
測試一下。
((repeated square 2) 5)
;value: 625
接下來就該來個遞迴了是不是。
在這裡我還試過一次在define的過程裡又define了乙個過程,再次報錯。終於博主決定將他們分開寫了。
(define repeated-iter
(lambda (f a)
(lambda (b)
(if (= a 1)
(f b)
((repeated-iter f (- a 1)) (fb))))))
(define repeated
(lambda (f a)
(lambda (b)
((repeated-iter f a) b))))
接下來我們來測試一下,這回事真正的測試了。
((repeated square 5) 5)
;value: 23283064365386962890625
這裡我只是挑了乙個比較大的數來展示,其為(square(square (square (square (square 5)))))。
SICP練習 38 練習1 43
練習1.43 我不想一開始就將結果貼出啦,而是通過敘述自己的思考來完成這篇部落格。上一題中我在紙上寫下 傳入2個過程並返回1個過程 事實證明挺有效的,於是這次我也依舊這麼做了。repeated 需要傳入乙個過程和乙個數字,這個數字決定了這個過程的執行次數。repeated還要返回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...