SICP練習 152 練習4 8

2022-08-21 20:09:13 字數 2336 閱讀 7530

exercise 4.8. 「named let」 is a variant of let that has the form

(let 

)

the and are just as in ordinary let, except that is bound within to a procedure whose body is and whose parameters are the variables in the . thus, one can repeatedly execute the by invoking the procedure named . for example, the iterative fibonacci procedure (section 1.2.2) can be rewritten using named let as follows:

(define

(fib n)

(let

fib-iter ((a

1)(b

0)(count

n))(if (=

count0)

b

(fib-iter

(+ a b) a (-

count1)))))

modify let->combination of exercise 4.6 to also support named let.

希望大家還是有事沒事看看原文啦,我才發現見過非常多次的modify原來是改動的意思。

關於named let的一些比較什麼的,大家能夠看這裡:【scheme歸納】3 比較do, let, loop。

從題目的**中我們也能夠看到named-let的名字能夠用cadr來取出,也就是書中的fib-iter。而body部分從下面**中也能夠看出來得用3個cdr和1個car。

(let 

)

而parameter題中已經說了是binding中變數。取出binding用caddr,而取出題目演示樣例中的a、b和count等則用map和car就可以。取出題目演示樣例中的1、0和n則用map和cadr。

那麼接下來我們還須要將named-let轉換成函式,用list來構造這些就好,首先當然是』define。然後再用cons把name和parameter構造在一起,最後就是body啦。

當然了,在let->combination中我們須要推斷是不是named-let?。那麼怎麼推斷呢。先推斷是否是let?,再推斷expr的名字是不是符號(symbol?)。

最後就能夠寫let-combination啦。首先用寫好的named-let?謂詞來進行推斷expr,然後為真的話就呼叫第257頁的sequence->exp函式。否則就用cons來繼續構造了。

(define

(named-let-name expr)

(cadr expr))

(define

(named-let-body expr)

(cadddr expr))

(define

(named-let-parameters expr)

(map

car (caddr expr)))

(define

(named-let-exp expr)

(map

cadr (caddr expr)))

(define

(named-let? expr)

(and

(let? expr)

(symbol?

(cadr expr))))

(define

(named-let->func expr)

(list

'define

(cons

(named-let-name epxr)

(named-let-parameters expr))

(named-let-body expr)))

(define

(let->combination expr)

(if (named-let? expr)

(sequence->exp

(list

(named-let->func expr)

(cons

(named-let-name expr)

(named-let-exp expr))))

(cons

(make-lambda

(let-vars expr)

(list

(let-body expr)))

(let-exp expr))))

SICP練習 152 練習4 8

exercise 4.8.named let is a variant of let that has the form let the and are just as in ordinary let,except that is bound within to a procedure whose ...

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