SICP練習 38 練習1 43

2021-06-28 18:42:25 字數 1176 閱讀 1617



練習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...