the little schemer 笔记(7)
第七章 Friends and Relations
這是一個set集合嗎
(apple peaches apple plum)
不是,apple出現了不止一次
(set? lat) 是真還是假,其中lat是(apples peaches peaches plums)
#t,因為沒有重復出現的原子
那么(set? lat)呢,其中lat是()
#t,因為沒有重復出現的原子
試試看寫出函數set?
(define set?
? (lambda (lat)
??? (cond
????? ((null? lat) #t)
????? (else (cond
????????????? ((member? (car lat) (cdr lat)) #f)
????????????? (else (set? (cdr lat))))))))
簡化set?
(define set?
? (lambda (lat)
??? (cond
????? ((null? lat) #t)
????? ((member? (car lat) (cdr lat)) #f)
????? (else (set? (cdr lat))))))
這個函數對(apple 3 pear 4 9 apple 3 4)有用嗎
是的,member?中現在用equal?替代了eq?
看到書member?出現在set?的定義中你驚訝嗎
別這樣,我們已經寫過member?了,現在我們想用就用。
(makeset lat)是什么,其中lat是(apple peach pear peach plum apple lemon peach)
(apple peach pear plum lemon)
試試用member?寫出函數makeset
(define makeset
? (lambda (lat)
??? (cond
????? ((null? lat) (quote ())
????? ((member? (car lat) (cdr lat)) (makeset (cdr lat)))
????? (else ((cons (car lat) (makeset (cdr lat))))))
函數短得讓你驚訝吧
希望如此。別怕:這個是正確的。
使用之前的定義,那么(makeset lat)是什么,其中(apple peach pear peach plum apple lemon peach)
(pear plum apple lemon peach)
試試用 multirember 重寫 makeset 函數?
(define makeset
? (lambda (lat)
??? (cond
????? ((null? lat) (quote ())
????? ((member? (car lat) (cdr lat)) (makeset (cdr lat)))
????? (else ((cons (car lat) (makeset (multirember (car lat) (cdr lat))))))))))
使用第二個定義,那么(makeset lat)是什么,其中(apple peach pear peach plum apple lemon peach)
(pear plum apple lemon peach)
用自己的話描述及喜愛第二個 makeset 函數定義是如何工作的。
下面是我們的描述:
“函數 makeset 在用刪除再次出現與第一個原子相同的原子成員后,把第一個原子cons到自然遞歸上。”
這個函數對(apple 3 pear 4 9 apple 3 4)有用嗎
是的,multirember中現在用equal?替代了eq?
(subset? set1 set2) 是什么,其中 set1 是(5 chicken wings) set2是(5 hamburgers 2 pieces fried chicken and light duckling wings)
#t,因為每一個set1中的原子也在set2中。
寫出函數 subset?
(define subset?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #t)
????? (else (cond
????????????? ((member? (car set1) set2) (subset? (cdr set1) set2))
????????????? (else #f))))))
你能寫出一個更簡單的嗎
(define subset?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #t)
????? ((member? (car set1) set2) (subset? (cdr set1) set2))
????? (else #f))))
試試用(and ...)重寫 subset?
(define subset?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #t)
????? (and ((member? (car set1) set2) (subset? (cdr set1) set2))))))
(eqset? set1 set2)是什么,其中set1是(6 large chickens with wings),set2是(6 chickens with large wings)
#t
寫出函數eqset?
(define eqset?
? (lambda (set1 set2)
??? (cond
????? ((subset? set1 set2)
?????? (subset? set1 set2))
????? (else #f))))
你能用一行的cond-寫出 eqset嗎
(define eqset?
? (lambda (set1 set2)
??? (cond
????? (and (subset? set1 set2) (subset? set1 set2)))))
寫出一行版
(define eqset?
? (lambda (set1 set2)
??? (and (subset? set1 set2) (subset? set1 set2))))
(intersect? set1 set2) 是什么,其中set1是 (stewed tomatoes and macaroni),set2是 (macaroni and cheese)
#t,因為set1至少有一個原子出現在set2中。交集
定義函數 intersect?
(define intersect?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #f)
????? (else (cond
????????????? ((member? (car set1)? set2) #t)
????????????? (else (intersect? (cdr set1) set2)))))))
?????????? ?
寫出更簡潔的版本
(define intersect?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #f)
????? ((member? (car set1)? set2) #t)
????? (else (intersect? (cdr set1) set2)))))
試試使用(or ...)寫 intersect?函數
(define intersect?
? (lambda (set1 set2)
??? (cond
????? ((null? set1) #f)
????? (or (member? (car set1)? set2)
????????? (intersect? (cdr set1) set2)))))
對比subset? 和interset?
(intersect set1 set2)是什么,其中set1是(stewed tomatoes and macaroni),set2是(macaroni and cheese)
(and macaroni)
現在你能寫出簡短版的函數 intersect
(define intersect
? (lambda (set1 set2)
??? (cond
????? ((null? set1) (quote ()))
????? ((member? (car set1) set2) (cons (car set1) (intersect (cdr set1) set2)))
????? (else (intersect (cdr set1) set2)))))
(union set1 set2)是什么,其中set1是(stewed tomatoes and macaroni casserole),set2是(macaroni and cheese)
(stewed tomatoes casserole macaroni and cheese)
寫出函數union
(define union
? (lambda (set1 set2)
??? (cond
????? ((null? set1) set2)
????? ((number? (car set1) set2) (union (cdr set1) set2))
????? (else (cons (car set1) (union (cdr set1) set2))))))
這個函數是什么
(define xxx
? (lambda (set1 set2)
??? (cond
????? ((null? set1) (quote ()))
????? ((member?? (car set1) set2) (xxx (cdr set1) set2))
????? (else (cons (car set1) (xxx (cdr set1) set2))))))
???? ?
我們的解釋是:
“這個函數返回的是set1中有,但是set2中沒有的原子。
(intersectall l-set)是什么,其中 l-set 是 ((a b c) (c a d e) (e f g h a b))
(a)
(intersectall l-set)是什么,其中 l-set 是
((6 pears and) (3 peaches and 6 peepers) (and 6 prunes with some apples))
(6 and)
現在使用任何你需要的的輔助函數寫出 intersectall ,假定所有的集合表都非空。
(define intersectall
? (lambda (l-set)
??? (cond
????? ((null? (cdr l-set)) (car l-set))
????? (else (intersect (car l-set) (intersectall (cdr l-set)))))))
這是一對a pair嗎(pear pear)
是的,列表中只有兩個原子。
注:一對a pair在Scheme(或Lisp)中是一個異樣但相關的東西
這是一對a pair嗎
(3 7)
是
這是一對a pair嗎
((2) (pair))
是。 因為列表中只有兩個表達式。
(a-pair? l),其中l是(full (house))
#t。 因為列表中只有兩個表達式。
定義函數 a-pair?
(define a-pair?
? (lambda (x)
??? (cond
????? ((atom? x) #f)
????? ((null? x) #f)
????? ((null? (cdr x)) #f)
????? ((null? (cdr (cdr x))) #t)
????? (else #f))))
怎樣取得一個對a piar的第一個 S-expression表達式
對pair取car
怎樣取得一個對a piar的第一個 S-expression表達式
對pair取cdr再取car
怎樣用兩個原子又稱一個 pair?
把兩個原子依次cons到一個()里,即(cons x1 (cons x2 (quote I())))
怎樣用兩個S-expression表達式又稱一個 pair?
把兩個S-expression表達式依次cons到一個()里,即(cons x1 (cons x2 (quote I())))
覺得上邊最后兩個問題的回答有什么區別嗎
沒什么區別
(define first
? (lambda (p)
??? (cond
????? (else (car p)))))
(define second
? (lambda (p)
??? (cond
????? (else (car (cdr p))))))
(define build
? (lambda (s1 s2)
??? (cond
????? (else (cons s1 (cons s2 (quote ())))))))
這三個函數會有什么用
它們被用來表示pair對和獲得pair對的成員。詳見第六章。他們用來提高可讀性,見下文。
請把這三個函數用一行重定義。
(define first
? (lambda (p)
??? (car p)))
(define second
? (lambda (p)
??? (car (cdr p))))
(define build
? (lambda (s1 s2)
??? (cons s1 (cons s2 (quote ())))))
你能寫出third的一行定義嗎
(define third
? (lambda (p)
??? (car (cdr (cdr p)))))
l是rel嗎,其中,l是(apple peaches pumpkin pie)
不是,因為l不是全由pair對構成。我們使用rel來表示relation。
l是rel嗎,其中,l是((apples peaches) (pumpkin pie) (apples peaches))
不是,因為l不是pair對的一個的集合,有重復的。
l是rel嗎,其中,l是((apples peaches) (pumpkin pie) )
是
l是rel嗎,其中,l是((4 3) (4 2) (7 6) (6 2) (3 4))
是
rel是fun嗎,其中rel是((4 3) (4 2) (7 6) (6 2) (3 4))
不是,我們用fun表示function函數。
(fun? rel) 的值是什么,其中rel是((8 3) (4 2) (7 6) (6 2) (3 4))
#t,因為(firsts rel)是一個set。firsts詳見第三章。
(fun? rel) 是什么,其中rel是((d 4) (b 0) (b 9) (e 5) (g 4))
#f,因為b重復了。
用set?和firsts寫出函數fun?
(define fun?
? (lambda (rel)
??? (set? (firsts rel))))
函數fun?是簡單的one-liner嗎
當然是啊
我們怎么定義有限函數
對于我們,有限函數是pair對組成的list表,其中每個pair的第一個元素沒有相同的。
(revrel rel)是什么,其中l是(8 a) (pumpkin pie) (got sick))
((a 8) (pie pumpkin) (sick got))
現在能寫出revrel函數
(define revrel
? (lambda (rel)
??? (cond
????? ((null? rel) (quote ()))
????? (else (cons (build (second (car rel))?
???????????????????????? (first (car rel)))
????????????????? (revrel (cdr rel)))))))
下面的這個對嗎
(define revrel
? (lambda (rel)
??? (cond
????? ((null? rel) (quote ()))
????? (else (cons (cons (car (cdr (car rel)))?
??????????????????????? (cons (car (car rel))
????????????????????????????? (quote ())))
????????????????? (revrel (cdr rel)))))))
是的,現在你看出“representation表達”對可讀性的益處了吧。
假設我們有如下函數revpair可以反轉一個piar對的兩個成員。
(define revpair
? (lambda (pair)
??? (build (second pair) (first pair))))
我們如何用這個輔助函數重寫revrel
沒問題,而且更易讀
(define revrel
? (lambda (rel)
??? (cond
????? ((null? rel) (quote ()))
????? (else (cons (revpair (cr rel))
????????????????? (revrel (cdr rel)))))))
猜猜看為什么fun不是fullfun,其中fun是((8 3) (4 2) (7 6) (6 2) (3 4))
fun不是fullfun,因為所有pair的第二項中2出現了不止一次。
為什么(fullfun? fun)是#t,其中fun是((8 3) (4 8) (7 6) (6 2) (3 4))
因為(3 8 6 2 4)是一個set。
(fullfun? fun) 是什么,其中fun是((grape raisin) (plum prune) (stewed prune))
#f
(fullfun? fun) 是什么,其中fun是((grape raisin) (plum prune) (stewed grape))
#t,因為(raisin prune grape)是一個集合。
定義fullfun?
(define fullfun?
? (lambda (fun)
??? (set? (seconds fun))))
你能定義seconds嗎
如同firsts
fullfun?還可以稱作什么
one-to-one一對一
你能想出第二種one-to-one的寫法嗎
(define one-to-one?
? (lambda (fun)
??? (fun? (revrel fun)))
問((chocolate chip) (doughy cookie))是一個 one-to-one一對一函數嗎
是的,你現在就該來一份!
去點一份((chocolate chip) (doughy cookie))吧!
或者你自己做一份,這樣不是更好嗎
(define cookies
? (lambda ()
??? (bake
????? (quote (350 degrees))
????? (quote (12 minutes))
????? (mix
??????? (quote (walnuts 1 cups))
??????? (quote (oatmeal 2 cups))
??????? (quote (salt .5 teaspoon))
??????? (quote (baking-powder 1 teaspoon))
??????? (quote (baking-soda 1 teaspoon)))
????? (mix
??????? (quote (eggs 2 large)))
??????? (quote (vanilla 1 teaspoon)))
??????? (cream
????????? (quote (butter 1 cups))
????????? (quote (sugar 2 cups)))))
轉載于:https://www.cnblogs.com/weekbo/p/10297424.html
總結
以上是生活随笔為你收集整理的the little schemer 笔记(7)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WannaCry勒索软件还在继续传播和感
- 下一篇: 六、Scrapy中Download Mi