the little schemer 笔记(2)
第二章 Do it, Do it Again, and Again, and Again...
假设l是 (Jack Sprat could eat no chicken fat) 那么 (lat? l)是真还是假
真。因为每个list表l中的 S-expression 都是atom原子。
假设l是 ((Jack) Sprat could eat no chicken fat) 那么 (lat? l)是真还是假
假。因为(car l)是一个list。
假设l是 (Jack (Sprat could) eat no chicken fat) 那么 (lat? l)是真还是假
假。因为list表l的其中一个 S-expression 不是list。
假设l是(),(lat? l)是真还是假
真。因为list表l中没有list表。
请问:lat是一个list表的atom原子对吗?
对。每个lat都是一个list表的atom原子。
用以下函数写一个lat?函数
car cdr cons null? atom? 和eq?
你现在还不能完成这个问题,因为你还有些东西有学到。看下面一个问题。
Are you rested?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
假设l是 (bacon and eggs),那么(lat? l)是什么
#t——真——因为l是一个lat
注:Lisp中:
(defun lat? (l)
(cond
((null l) t)
((atom? (car l)) (lat? (cdr l)))
(t nil)))
我们怎么推知(lat? l)的答案是 #t
现在这个问题你也回答不了。这个问题由lat?的查询决定。
提示:写下lat?的定义然后看下面的系列问答。
(lat? l) 的第一个查询是什么
(null? l)
注意:
(cond ...) 提问
(lambda ...) 产生函数
(define ...) 给出函数名
cond行 ((null?l) #t)是什么意思 其中l是 (bacon and eggs)
(null? l) 查询参数l是否是null。如果是,则是真;否则为假,cond执行下一个查询。
下一个查询是什么
(atom? (car l))
下面这行是什么意思,其中l是(bacon and eggs)
((atom? (car l)) (lat? (cdr l)))
(atom? (car l))询问list表l的第一个 S-expression 是否是atom。r如果(car l)是一个atom原子,那么我们要知道l的其余组成部分是否是atom原子。如果(car l)不是atom原子,我们询问下一个查询。在当前情况下(acr l)是一个atom原子,所以值由函数(lat? (cdr l))决定。
(la? (cdr l))是什么意思
(lat? (cdr l))通过lat?查询新的参数发现是否list表l的剩余组成部分都是是atom原子。
现在lat?的参数l是什么
现在的l是(cdr l),也就是(and eggs)
下一个查询是什么
(null? l)
下面这行是什么意思,其中l现在是 (and eggs)
((null? l) #t)
(null? l) 查询参数l是否是null。如果是,则是#t真;否则cond执行下一个查询。
下一个查询是什么
(atom? (car l))
下面这行是什么意思,其中l是(and eggs)
((atom? (car l)) (lat? (cdr l)))
(atom? (car l))询问list表l的第一个 S-expression 是否是atom。r如果(car l)是一个atom原子,那么我们要知道l的其余组成部分是否是atom原子。如果(car l)不是atom原子,我们询问下一个查询。在当前情况下(acr l)是一个atom原子。
(la? (cdr l))是什么意思
(lat? (cdr l))通过lat?查询新的参数发现是否list表l的剩余组成部分都是是atom原子,这一次(cdr l)是(eggs)。
下一个查询是什么
(null? l)
下面这行是什么意思,其中l现在是 (eggs)
((null? l) #t)
(null? l) 查询参数l是否是null。如果是,则是#t真;否则cond执行下一个查询。此情况下,l不是null,所以查询下一个问题。
下一个查询是什么
(atom? (car l))
下面这行是什么意思,其中l是(and eggs)
((atom? (car l)) (lat? (cdr l)))
(atom? (car l))询问list表l的第一个 S-expression 是否是atom。r如果(car l)是一个atom原子,那么我们要知道l的其余组成部分是否是atom原子。如果(car l)不是atom原子,我们询问下一个查询。在当前情况下(acr l)是一个atom原子,所以再一次我们查询(lat? (cdr l))。
(la? (cdr l))是什么意思
(lat? (cdr l))通过lat?查询新的参数发现是否list表l的剩余组成部分都是是atom原子,其中新查询的参数l变为(cdr l)。
现在lat?的参数是什么
()
下面这行是什么意思,其中l现在是 ()
((null? l) #t)
(null? l) 查询参数l是否是null。如果是,则是#t真;否则cond执行下一个查询。此情况下,l是空表(),所以(lat? l是#t真,其中l是(bacon and eggs)。
还记得(lat? l)的查询吗
记不得了吧? 当l为(bacon and eggs)时,操作(alt? l)的值为#t
你可以用自己的语言描述一下函数lat?做了什么吗
这是我们的描述
“lat? 查找list表中的每一个 S-expression表达式,看每一个 S-expression表达式是否是atom原子,直到没有 S-expression了。如果从头至尾没有遇到一个list表,那么返回#t,否则返回#f——false”
下面再写一次lat?的定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(lat? l)的值是多少,其中l现在是(bacom (and eggs))
第一个查询是什么
(null?l)
((null?l) #t)是什么意思 其中l是 (bacon (and eggs))
(null? l) 查询参数l是否是null。如果是,则是真;否则为假,cond执行下一个查询。此情况下,l非空,进行下一个查询。
下一个查询是什么
(atom? (car l))
下面这行是什么意思,其中l是(bacon (and eggs))
((atom? (car l)) (lat? (cdr l)))
(atom? (car l))询问list表l的第一个 S-expression 是否是atom。r如果(car l)是一个atom原子,那么我们要知道l的其余组成部分是否是atom原子。如果(car l)不是atom原子,我们询问下一个查询。在当前情况下(acr l)是一个atom原子,所以我们查询list表l的剩余部分看是否都是原子。
(la? (cdr l))是什么意思
(lat? (cdr l))通过lat?查询新的参数发现是否list表l的剩余组成部分都是是atom原子,其中把l替换为(cdr l)。
下面这行是什么意思,其中l现在是 ((and eggs))
((null? l) #t)
(null? l) 查询参数l是否是null。如果是,则是#t真;否则cond执行下一个查询。
下一个查询是什么
(atom? (car l))
下面这行是什么意思,其中l是((and eggs))
((atom? (car l)) (lat? (cdr l)))
(atom? (car l))询问list表l的第一个 S-expression 是否是atom。r如果(car l)是一个atom原子,那么我们要知道l的其余组成部分是否是atom原子。如果(car l)不是atom原子,我们询问下一个查询。在当前情况下(acr l)不是一个atom原子,进行下一个查询。
下一个查询是什么
else
else查询是什么意思
else查询是否为真
else是真吗
是的,else总是真。
else
当然of course
为什么else是最后一个查询
因为我们不需要其它查询
为什么我们不需要其它查询
因为list可以是空表,也可以在第一个位置是atom原子,也可以在第一个位置是list表
(else #f) 是什么意思
else查询else是否是真。else本身是真查询#f,得到#f假。
))) 解释下
匹配前边的(cond ..,(lambda...和(define...括号
你能描述一下我们如何得出(lat? l) 是 #f的,其中l是(baco (and eggs))
一种解释是
“(lat? l)查询参数中的每一项是否是原子。如果在发现一个list之前就结束,那么值是#t。如果如这个例子(bacon (and eggs))中它找到一个list,那么(lat? l)的值就是#f”
问(or (null? l1) (atom? l2))是真还是假, 其中l1是(),l2是(d e f g)
真,因为(null? l1)是真。
问(or (null? l1) (null? l2))是真还是假, 其中l1是(a b c),l2是(a b c)
真,因为(null? l2)是真。
问(or (null? l1) (null? l2))是真还是假, 其中l1是(a b c),l2是()
真,因为(null? l2)是真。
问(or (null? l1) (null? l2))是真还是假, 其中l1是(a b c),l2是(atom)
假,因为无论(null? l1)还是(null? l2))是都是假。
(or ...)是做什么的
(or ...)查询两个问题,每次一个。如果第一个是真那么停止并回答真。否则查询第二个问题并以第二个问题的回答作为答案。
问a是否是lat的一个成员,其中a是tea,lat是(coffee tea or milk)
真。
问(member? a lat) 是真还是假,其中a是poached,lat是(fried eggs and scrambled eggs)
假。
下面是函数member?的定义
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
(else (or (eq? (car lat) a)
(member? a (cdr lat)))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
问(member? a lat)是什么 其中a是meat,lat是(mashed potatoes and meat gravy)
#t,因为atom原子meat是lat中的一个原子。
我们怎么推知是#t
值由查询(member? a lat)得到。提示:写出member?函数然后对照下面的问题。
(member? a lat)的第一个查询是什么
(null? lat)。这也是lat?的第一个查询。
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
The First Commandment
第一戒
(开端)
任何函数的第一个查询表达式重视null?
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
((null? lat) #f) 其中lat是(mashed potatoes and meat gravy)
(null? lat) 查询参数l是否是null。如果是,则值是#f,;否则为假,cond执行下一个查询。
下一个查询是什么
else。
为什么else是下一个查询
因为我们不需要其它查询。
else真的是一个查询吗
是的,else总是真。
下面这行是什么意思
(else (or (eq? (car lat) a)
(member? a (cdr lat))))
现在我们知道lat不是null,我们必须找出lat的car是不是a,或者lat的其他地方是不是a。
问a是meat,lat是(mashed potatoes and meat gravy)时
(or (eq? (car lat) a)
(member? a (cdr lat))))
是真还是假
下面一点点分析
问a是meat,lat是(mashed potatoes and meat gravy)时,(eq? (car lat) a)是真还是假
假。
(or ...)的第二个查询是什么
(member? a (cdr lat))。递归查询函数menber?,参数lat变为(cdr lat)
现在member?的参数是什么
lat现在是(cdr alt),即(potatoes and meat gravy)
下一个查询是什么
(null? lat)。记得第一戒。
当lat是(potatoes and meat gravy)时,(null? lat) 真还是假
#f假。
下面做什么
下一个查询。
下面这行是什么意思
(or (eq? (car lat) a)
(member? a (cdr lat))))
的出a是否与lat的car是eq?相同或者递归查找a是否是lat的cdr中的成员。
下面做什么
查询(member? a (cdr lat)
现在member的参数是什么
a是meat,lat是(and meat gravy)
下一个查询是什么
(null? lat)
下面做什么
因为(null?lat)是假,下一个查询
是什么
else
下面的代码是什么值
(or (eq? (car lat) a)
(member? a (cdr lat)))
#t真。因为(car lat)即meat与a相同都是原子meat,所以(or ...)是真。
(member? a lat)的值是什么,其中a是meat,lat是(meat gravy)
#t
(member? a lat)的值是什么,其中a是meat,lat是(and meat gravy)
#t
(member? a lat)的值是什么,其中a是meat,lat是(potatoes and meat gravy)
#t
(member? a lat)的值是什么,其中a是meat,lat是(mashed potatoes and meat gravy)
#t
为了确保你的确会了,让我们快速的再来一次
(member? a lat)的值是什么,其中a是meat,lat是(mashed potatoes and meat gravy)
提示:写下member?函数的定义然后参考下面的问题。
(null? lat)
否
else
是
(or (eq? (car lat) a)
(member? a (cdr lat))))
或许
(eq? (car lat) a)
否,下个查询
是什么
函数递归参数a和(cr lat),a是meat,(cdr lat)是(potatoes and meat gravy)。
(null? lat)
否。下一行。
else
是,但是(eq? (car lat) a) 为否。函数递归参数a和(cdr lat),a为meat,(cdr lat)为(and meat gravy)
(null? lat)
否。下一行。
else
是,但是(eq? (car lat) a)为否。函数递归参数a和(cdr lat),
a是meat,lat是(meat gravy)。
(null? lat)
否,下个查询。
(eq? (car lat) a)
是,值为#t。
(or (eq? (car lat) a)
(member? a (cdr lat))))
#t
回溯上去知道a为meat,lat为(mashed potatoes and meat gravy)时为#t真。
(member? a lat)的值是什么,其中a是liver,lat是(bagels and ox)
#f
让我们看看为什么是#f。第一个查询是什么
(null? lat)
(null? lat)
否。下一行。
else
是,但是(eq? (car lat) a)是false。函数递归参数a和(cdr lat),其中a是liver,(cdr lat)是(and lox)。
(null? lat)
否,下个查询
else
是,但是(eq? (car lat) a)是false。函数递归参数a和(cdr lat),其中a是liver,(cdr lat)是(lox)。
(null? lat)
否,下个查询
else
是,但是(eq? (car lat) a)是false。函数递归参数a和(cdr lat),其中a是liver,(cdr lat)是()。
(null? lat)
是。
(member? a lat)的值是什么,其中a是liver,lat是()
#f
下面的代码是什么值,其中a是liver,lat是(lox)
(or (eq? (car lat) a)
(member? a (cdr lat)))
#f
(member? a lat)的值是什么,其中a是liver,lat是(lox)
#f
下面的代码是什么值,其中a是liver,lat是(and lox)
(or (eq? (car lat) a)
(member? a (cdr lat)))
#f
(member? a lat)的值是什么,其中a是liver,lat是(and lox)
#f
下面的代码是什么值,其中a是liver,lat是(bagels and lox)
(or (eq? (car lat) a)
(member? a (cdr lat)))
#f
(member? a lat)的值是什么,其中a是liver,lat是(bagels and lox)
#f
相信这些吗?你可以休息下了!

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 China Mainland License.
the little schemer 笔记(2)的更多相关文章
- 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 笔记(7)
第七章 Friends and Relations 这是一个set集合吗 (apple peaches apple plum) 不是,apple出现了不止一次 (set? lat) 是真还是假,其中l ...
- 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是数吗 是的 ...
随机推荐
- [网页游戏开发]Morn组件赋值
在讲解List之前,我们先介绍一下Morn组件赋值功能 默认属性赋值 界面逻辑开发过程中,经常会涉及到动态更改UI属性,比如: 界面有一个按钮,一个多选框和一个文本,分别命名为myButton,myC ...
- Jmeter使用Http代理服务器报DNSName components must begin with a letter的错
最近了解到JMeter可以实现app的性能测试,需要借助JMeter的Http代理服务器来录制脚本. 于是,就按着网上的教程来进行操作,然而出师不利啊,刚启动就报错
- 全局钩子 实例(不使用DLL和使用DLL两种)
大家应该都知道,全局消息钩子要依赖于一个DLL才能够正常工作.于是呢,我也就理所当在地认为全局钩子都要依赖于一个DLL才能正常工作的,我想大部分人肯定和我一样也这么认为的. 但实际上不是这样的.有某些 ...
- C# Excel批注“哪种开发语言最好”
Excel批注经常使用于为个别的单元格加入凝视.读者可以从凝视中获取额外的信息. 批注可隐藏,仅仅会在单元格右上方显示红色三角.加入后不会对单元格的内容喧宾夺主.在日常编程处理Excel中,为个别单元 ...
- 定时任务Timer
一.Timer介绍 java.util.Timer java.util.TimerTask Timer是一个定时器类,通过该类可以为指定的定时任务进行配置.TimerTask类是一个定时任务类,该类实 ...
- gradle配置
一.你不想看到的 Gradle Build Running 话说在天朝当程序员也是很不容易的,不管是查阅资料还是下载东西,很多时候你会发现自己上网姿势不对,当然对大多数程序员来说,这都不是事儿.这次重 ...
- bzoj2436: [Noi2011]Noi嘉年华
我震惊了,我好菜,我是不是该退役(苦逼) 可以先看看代码里的注释 首先我们先考虑一下第一问好了真做起来也就这个能想想了 那么离散化时间是肯定的,看一手范围猜出是二维DP,那对于两个会场,一个放自变量, ...
- JavaScript函数调用规则
1. [代码][JavaScript]代码 JavaScript函数调用规则一 (1)全局函数调用:function makeArray( arg1, arg2 ){ return [t ...
- 让th里面的东西自动换行
让th里面的东西自动换行 html中的TH里面的文字不管多长,始终是一行,很烦 <th style="word-wrap:break-word;">aaaaaaaaaa ...
- poj 2771 Guardian of Decency(最大独立数)
题意:人与人之间满足4个条件之一即不能成为一对(也就说这4个条件都不满足才能成为一对),求可能的最多的单身人数. 思路:把男女分为两部分,接下来就是二分图的匹配问题.把能成为一对的之间连边,然后求出最 ...