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)))))
the little schemer 笔记(7)的更多相关文章
- the little schemer 笔记(0)
the little schemer 笔记 Z.X.L 2012年08月13日 五项规则 car的规则car只对非空列表有定义. cdr的规则cdr只对非空列表有定义.任何非空列表的cdr是另外一个列 ...
- the little schemer 笔记(10)
第十章 What Is the Value of All of This? entry条目 是由list表组成的 pair 对,pair 对的第一个list表是集合 set.另外,两个list表的长 ...
- the little schemer 笔记(3)
第三章 cons the magnificent (rember a lat)是什么,其中a是mint,lat是(lamb chops and mint jelly) (lamb chops and ...
- the little schemer 笔记(10.1)
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 China Mainla ...
- the little schemer 笔记(9)
第九章 ...and Again, and Again, and, Again, ... 你想来点鱼子酱吗? 那就去找它吧. (looking a lat)是什么,其中a是 caviar, lat是( ...
- the little schemer 笔记(8)
第八章 lambda the ultimate 还记得我们第五章末的rember和insertL吗 我们用equal?替换了eq? 你能用你eq?或者equal?写一个函数rember-f吗 还不能, ...
- the little schemer 笔记(5)
第五章 “Oh My Gawd”:It's Full of Stars (rember* a l)是什么,其中a是cup,l是((coffee) cup ((tea) cup) rember*发音为r ...
- the little schemer 笔记(6)
第六章 Shadows 1 是算术表达式吗 是 3 是算术表达式吗 是的 1+3 是算术表达式吗 是的 1+3×4 是算术表达式吗 当然是 cookie 是算术表达式吗 是啊,你需要来一块吗 e那么 ...
- the little schemer 笔记(4)
第四章 numbers games 14 是原子吗 是的,数都是原子 (atom? n) 是真还是假,其中n是14 真,14 是原子 -3是数吗 是的,不过我们暂不考虑负数 3.14159是数吗 是的 ...
随机推荐
- php输出echo、print、print_r、printf、sprintf、var_dump比较
php输出echo.print.print_r.printf.sprintf.var_dump比较 一.echo echo() 实际上不是一个函数,是php语句,因此您无需对其使用括号.不过,如 ...
- [ASP.NET MVC 小牛之路]05 - 使用 Ninject实现依赖注入
在[ASP.NET MVC 小牛之路]系列上一篇文章(依赖注入(DI)和Ninject)的末尾提到了在ASP.NET MVC中使用Ninject要做的两件事情,续这篇文章之后,本文将用一个实际的示例来 ...
- python day - 09 函数
函数 1.函数的定义,引用. 定义:函数是对功能和代码块的封装和定义. 函数用 def关键字来表示. 格式: def 函数名(): 函数体 eg: return(返回值) 在函数中遇到return ...
- intellij IDEA 更新java后不用重启tomcat
最近项目大了,每次修改后重启都要等和很久,那个煎熬…… 为了解决这个问题,万能的Google 装了这个 JREBEL 5.63最新的 安装步骤: 一.IDEA在线搜索 jrebel 安装 二.破 ...
- 转载-STM32片上FLASH内存映射、页面大小、寄存器映射
原文地址:http://blog.chinaunix.net/uid-20617446-id-3847242.html 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Fl ...
- 织梦栏目页分页title加"第N页"
以上就是调用栏目管理的SEO标题代码:{dede:field.seotitle /}的方法,这样充分体现列表页标题显示的效果,有利于搜索引擎的收录. 第二个问题就是这样列表页的标题都成了一个样子的了, ...
- 织梦文章分页后文章title的修改使得不一致
织梦Dedecms是一个不错的建站cms系统,最近在用织梦建站的时候发现文章分页后,每个分页都是同一个标题,不利于优化,想在分页后面加上一个数字来进行区别,怎么做呢? 找到include/arc.ar ...
- 根据用户时区显示当地时间 javascript+php
在跨时区应用中会用到下面代码,这是以前写的一段代码. 服务器保存相关时间配置,保存形式为GMT时间,客户端需要根据客户所在时区做相应显示,以符合客户习惯. 1. [代码][JavaScript]代码 ...
- CentOS设置代理
假设我们要设置代理为 IP:PORT1.网页上网网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->>Advanced--> ...
- 基于阿里云上实现全站https的正确姿势(一)
对应的网址:https://yq.aliyun.com/articles/65199 摘要: 目前主流大厂的网站和服务都已经实现了全站https, 例如: baidu, taobao, jd等. 关于 ...