4.38,谜题就有翻译错误,问题更是错的离谱。原题是这样的:
Baker, Cooper, Fletcher, Miller, and Smith live on different floors of an apartment house
that contains only five floors. Baker does not live on the top floor. Cooper does not live on
the bottom floor. Fletcher does not live on either the top or the bottom floor. Miller lives on
a higher floor than does Cooper. Smith does not live on a floor adjacent to Fletcher's.
Fletcher does not live on a floor adjacent to Cooper's. Where does everyone live?
其中说Miller住的比Cooper高,却翻译成了Miller住的比Cooper高一层,如果按照这个翻译来谜题是没有答案的。
回到4.38,题目是这样的:
Modify the multiple-dwelling procedure to omit the requirement that Smith and Fletcher do
not live on adjacent floors. How many solutions are there to this modified puzzle?
翻译却成了增加Smith和Fletcher不住在相邻层这个条件,谜题本来就是如此,何来的增加?错将omit翻译成了“增加”。
这道题很简单咯,将
<!---->(require (not (= (abs (- smith fletcher)) 1)))
注释掉即可,答案增加到5个:
<!---->> (multiple-dwelling)
((baker 1) (cooper 2) (fletcher 4) (miller 3) (smith 5))
> (amb)
((baker 1) (cooper 2) (fletcher 4) (miller 5) (smith 3))
> (amb)
((baker 1) (cooper 4) (fletcher 2) (miller 5) (smith 3))
> (amb)
((baker 3) (cooper 2) (fletcher 4) (miller 5) (smith 1))
> (amb)
((baker 3) (cooper 4) (fletcher 2) (miller 5) (smith 1))
4.39,约束条件的顺序肯定是有影响的,能缩小搜索范围的强约束条件排在前面,弱约束条件排在后面,可以减少整体的判断次数。在DrScheme中,可以启用profile来分析顺序带来的影响,打开language->R5RS->Show Details,选择Debugging and Profiling 即可。运行scheme程序,然后在View->Show Profile中查看具体分析结果,在该视图中将详细列出各个函数调用的时间和次数。
在没有调整顺序前:
Msec Calls Function
40 1 multiple-dwelling
0 1716 require
4 2524 distinct?
说明multiple-dwelling调用了一次,花费了40毫秒,而require和distinct?函数分别被调用了1716次和2524次。
然后我将
(require
(distinct? (list baker cooper fletcher miller smith)))
这个我认为弱约束条件放到了最后,测试的结果并不让人满意:
Msec Calls Function
44 1 multiple-dwelling
4 6035 require
0 129 distinct?
并没有大的提高,甚至反而所下降。猜测问题在于我使用的amb实现是call/cc、宏实现的,待俺完成amb求值器再测试一下。
4.40,题目都提示咯,嵌套let语句,我的解答:
<!---->(define (multiple-dwelling2)
(let ((baker (amb 1 2 3 4 5)))
(require (not (= baker 5)))
(let ((cooper (amb 1 2 3 4 5)))
(require (not (= cooper 1)))
(let ((fletcher (amb 1 2 3 4 5)))
(require (not (= fletcher 5)))
(require (not (= fletcher 1)))
(require (not (= (abs (- fletcher cooper)) 1)))
(let ((miller (amb 1 2 3 4 5)))
(require (> miller cooper))
(let ((smith (amb 1 2 3 4 5)))
(require (not (= (abs (- smith fletcher)) 1)))
(require (distinct? (list baker cooper fletcher miller smith)))
(list (list 'baker baker)
(list 'cooper cooper)
(list 'fletcher fletcher)
(list 'miller miller)
(list 'smith smith))))))))
profile一下,
multiple-dwelling2的调用时间缩小到8毫秒,require和distinct?的调用次数分别降低到了404和129次。
4.42,说谎者谜题,
五个女生参加一个考试,她们的家长对考试结果过分关注。为此她们约定,在给家里写信谈到考试的时候,每个姑娘都要写一句真话和一句假话。下面是从她们的信里摘抄出来的句子:
Betty : kitty考第二,我只考了第三
Ethel : 你们应该很高兴听到我考了第一,joan第二
joan : 我考第三,可怜的Ethel垫底
kitty: 我第二,marry只考了第四
marry: 我是第四,Betty的成绩最高。
这五个姑娘的实际排名是什么?
将题目翻译成代码就OK了,说明性编程真是舒坦:
<!---->(define (liars-puzzle)
(let ((betty (amb 1 2 3 4 5))
(ethel (amb 1 2 3 4 5))
(joan (amb 1 2 3 4 5))
(kitty (amb 1 2 3 4 5))
(marry (amb 1 2 3 4 5)))
(require
(distinct? (list betty ethel joan kitty marry)))
(require (or (= kitty 2) (= betty 3)))
(require (not (and (= kitty 2) (= betty 3))))
(require (or (= ethel 1) (= joan 2)))
(require (not (and (= ethel 1) (= joan 2))))
(require (or (= joan 3) (= ethel 5)))
(require (not (and (= joan 3) (= ethel 5))))
(require (or (= kitty 2) (= marry 4)))
(require (not (and (= kitty 2) (= marry 4))))
(require (or (= marry 4) (= betty 1)))
(require (not (and (= marry 4) (= betty 1))))
(list (list 'betty betty)
(list 'ethel ethel)
(list 'joan joan)
(list 'kitty kitty)
(list 'marry marry))))
答案是:
((betty 3) (ethel 5) (joan 2) (kitty 1) (marry 4))
4.43.也很有趣的题目,游艇迷题,
Mary Ann Moore的父亲有一条游艇,他的四个朋友Colonel Dowing、Mr.Hall、Sir Barnacle Hood和Dr.Parker也各有一条。这五个人都有一个女儿,每个人都用另一个人的女儿的名字来为自己的游艇命名。Sir Barnacle的游艇叫Gabrielle,Mr.Moore拥有Lorna,Mr.Hall的游艇叫Rosalind,Melissa属于Colonel Downing(取自Sir Barnacle的女儿的名字),Garielle的父亲的游艇取的是Dr.Parker的女儿的名字。请问,谁是Lorna的父亲。
先说下结果,Lorna的父亲是Downing。
具体解答如下,先定义辅助过程:
<!---->(define (father yacht daughter)
(cons yacht daughter))
(define (yacht father)
(car father))
(define (daughter father)
(cdr father))
然后翻译题目为代码即可,暂不考虑效率问题:
<!---->(define (yacht-puzzle)
(let ((moore (father 'lorna 'mary)) ;;Mr.Moore
(downing (father 'melissa (amb 'mary 'melissa 'gabrielle 'rosalind 'lorna)))) ;;Colonel Downing
(require (not (equal? (yacht downing) (daughter downing))))
(let ((hall (father 'rosalind (amb 'mary 'melissa 'gabrielle 'rosalind 'lorna)))) ;;Mr.Hall
(require (not (equal? (yacht hall) (daughter hall))))
(let ((barnacle (father 'gabrielle 'melissa)) ;;Sir Barnacle Hood
(parker (father (amb 'mary 'melissa 'gabrielle 'rosalind 'lorna) (amb 'mary 'melissa 'gabrielle 'rosalind 'lorna)))) ;;Dr.Parker
(require (not (equal? (yacht parker) (daughter parker))))
(let ((gabrielle-father (amb moore downing hall barnacle parker))) ;;Garielle's Father
(require (equal? (daughter gabrielle-father) 'gabrielle))
(require (equal? (yacht gabrielle-father) (daughter parker)))
(require (distinct? (map daughter (list moore downing hall barnacle parker))))
(require (distinct? (map yacht (list moore downing hall barnacle parker))))
(list
(list 'moore (yacht moore) (daughter moore))
(list 'downing (yacht downing) (daughter downing))
(list 'hall (yacht hall) (daughter hall))
(list 'barnacle (yacht barnacle) (daughter barnacle))
(list 'parker (yacht parker) (daughter parker))))))))
运行(yacht-puzzle)的结果为:
((moore lorna mary) (downing melissa lorna) (hall rosalind gabrielle) (barnacle gabrielle melissa) (parker mary rosalind))
三元组:父亲名、游艇名、女儿名,因此lorna的父亲是Downing。Garielle的父亲是Mr.Hall,Mr.Hall的游艇名叫做Rosalind,正是Dr.Parker的女儿名字。
延伸题目,如果没有Mary Ann姓Moore这个条件,答案将有三个,分别是:
((moore lorna mary) (downing melissa lorna) (hall rosalind gabrielle) (barnacle gabrielle melissa) (parker mary rosalind))
((moore lorna gabrielle) (downing melissa rosalind) (hall rosalind mary) (barnacle gabrielle melissa) (parker mary lorna))
((moore lorna lorna) (downing melissa mary) (hall rosalind gabrielle) (barnacle gabrielle melissa) (parker mary rosalind))
分享到:
相关推荐
2. **chapter2.ss**: 这可能是整个第二章所有练习题的集合或者部分题目的解答。通过这个文件,读者可以系统地查看和学习整个章节的关键概念和解题策略。 3. **queens.ss**: "Queens问题"是一个经典的问题,涉及到在...
《计算机程序的构造和解释》...通过解答SICP的习题,读者将深入理解这些概念,并能运用到实际的编程实践中。习题旨在促进对这些基本原理的深入思考,帮助程序员建立坚实的基础,进而在面对复杂的编程挑战时能游刃有余。
《SICP习题解答,主要第一章的内容习题答案》 SICP,全称《Structure and Interpretation of Computer Programs》(计算机程序的构造和解释),是计算机科学领域的一本经典教材,由MIT(麻省理工学院)的 Harold ...
sicp in python 中文版 sicp in python 中文版 sicp in python 中文版 !!!download>>>https://github.com/wizardforcel/sicp-py-zh
SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版SICP中文第二版
在" sicp-master "这个压缩包中,可能包含的是对SICP各章节练习题的解答,包括源代码、注释和分析。这些练习通常涵盖了函数式编程的基础,如高阶函数、递归、闭包,以及更高级的主题,如过程构造、数据结构、环境...
《计算机程序的构造与解释》(Structure and Interpretation of Computer Programs,简称SICP)是一本备受推崇的经典计算机科学教材,由Harold Abelson和Gerald Jay Sussman撰写,并由MIT出版社出版。这本书以其深入...
《SICP解题集》是一份专注于探讨和解答《结构与解释程序》(Structure and Interpretation of Computer Programs,简称SICP)一书中习题的资源。SICP是计算机科学领域的一本经典教材,由Harold Abelson、Gerald Jay ...
总的来说,SICP 2.2.4节的图形语言不仅是学习Scheme或Racket编程的一个重要部分,更是对计算思维和编程艺术的一次深入探索。通过实践和理解这些概念,你将能更好地理解和创造计算世界中的视觉表现形式。
笔记部分可能包括了对书中概念的解释、关键理论的总结、重要算法的剖析以及作者对练习题的解题思路。从描述来看,笔记作者最初是按照SICP第一版的内容进行记录,直到习题1.31时,转而参考第二版的内容。这意味着笔记...
SICP-Python版本
SICP 使用的scheme解释器 以前叫DrScheme
书中大量的练习题和示例代码鼓励读者动手实践,加深对概念的理解。此外,SICP还引入了许多先进的编程思想和技术,如函数式编程、递归、抽象数据类型等,这些都对现代软件开发产生了深远的影响。 #### 四、总结 ...
本书名为《a_book_sicp_py》,是一本以Python语言为基础介绍设计模式和计算机科学基础的书籍。根据描述和部分内容,可以提炼出以下知识点: 1. 编程语言的重要性:在计算机科学的宽泛领域中,编程语言扮演着至关...
Python SICP epub版本,很适合学习抽象的思想,用Python版本比lisp更实用
《计算机程序构造和解释》(SICP,Structure and Interpretation of Computer Programs)是一本具有深远影响力的计算机...压缩包中的“SICP 北大课件”文件可能包含课件、讲义、习题解答等资料,是学习SICP的宝贵资源。
《SICP》全称是《Structure and Interpretation of Computer Programs》,中文译为《计算机程序的构造和解释》。这是一本经典的计算机科学教材,由Harvard大学的 Harold Abelson 和 Gerald Jay Sussman 教授撰写,...
"sicp-solutions"是一个针对该书练习题的解答集,主要使用了Scheme语言,一个Lisp方言,而具体的实现环境是mit-scheme 9.2。 Scheme语言是Lisp家族的一员,以其简洁的语法和强大的函数式编程特性闻名。在"sicp-...
标题中的"PyPI 官网下载 | sicp-0.0.1b102.dev4.tar.gz"指的是从Python的官方包索引(Python Package Index,简称PyPI)上下载的一个名为"sicp"的软件包的版本号为0.0.1b102.dev4的压缩文件,其格式是tar.gz。...