三分 的个人资料3fen's Notebook照片日志列表更多 ![]() | 帮助 |
|
5月26日 3.19 答案;3.19 ;08/5/26 ;设置两个指针first-man/second-man,一个一次走一步,另一个走两步,如果可以达到两者相等的状态说明有环存在;反之则无。 ;这样空间消耗只需记录两个指针即可,而不用把环出现之前的所有节点都记录下来。 (define (cycle? x) (let ((first-man (if (pair? x) (cdr x) '()))) (let ((second-man (if (or (null? first-man) (not (pair? (cdr x)))) '() (cdr (cdr x))))) (define (cycle-helper) (cond ((eq? first-man second-man) #t) ((and (pair? first-man) (pair? second-man)) (begin (set! first-man (cdr first-man)) (set! second-man (if (pair? (cdr second-man)) (cdr (cdr second-man)) '())) (cycle-helper))) (else #f))) (cycle-helper)))) 3.18 答案;与前面的count-pairs类似,不同之处在于不用考虑car了,只遍历cdr即可 ;这样空间复杂度是O(n)的,因为要把环出现之前的节点全部保存在checked-list中 (define (cycle? x) (let ((checked-list '())) ;---already-in-list--- (define (already-in-list? x the-list) (cond ((null? the-list) #f) ((eq? x (car the-list)) #t) (else (already-in-list? x (cdr the-list))))) ;----checked-pair?---- (define checked-pair? (lambda(x) (if (already-in-list? x checked-list) #t (begin (set! checked-list (cons x checked-list)) #f)))) (define (cycle-helper xx) (cond ((not (pair? xx)) #f) ((checked-pair? (car xx)) #t) (else (cycle-helper (cdr xx))))) (cycle-helper x))) 3.17答案;3.17 ;08/5/26 ;checked-list要定义为count-pairs的内部变量,因为每一次count-pairs执行都要清空一次checked-list,否则就会出现第一次执行返回3,而第二次执行返回0的错误。 (define (count-pairs x) (let ((checked-list '())) ;---already-in-list--- (define (already-in-list? x the-list) (cond ((null? the-list) #f) ((eq? x (car the-list)) #t) (else (already-in-list? x (cdr the-list))))) ;----checked-pair?---- (define checked-pair? (lambda(x) (if (already-in-list? x checked-list) #t (begin (set! checked-list (cons x checked-list)) #f)))) (define (count-helper xx) (cond ((not (pair? xx)) 0) ((checked-pair? xx) 0) (else (+ (count-helper (car xx)) (count-helper (cdr xx)) 1)))) (count-helper x))) PS:做这道题的时候又遇到之前的一个问题,但是还是不知道怎样解释... 3.16 答案开始对“统计序对的个数”不太理解,后来认为题目的意思应该是把盒子指针图画出来以后其中“盒子”的数目。 这样Ben的count-pairs过程的bug就出在会把引用两次以上的同一个序对看做成多个。比如: (define p3 (list 1 2 3)) ;3 (define temp4 (cons 1 2)) (define p4 (cons 0 (cons temp4 temp4))) ;4 (define temp7_1 (cons 1 2)) (define temp7_2 (cons temp7_1 temp7_1)) (define p7 (cons temp7_2 temp7_2)) ;7 (define temp0 (cons 1 2)) (set-cdr! temp0 temp0) (define p0 (cons 1 (cons temp0 temp0)));死循环 3.15 答案讲完共享这一小节,明白了eq?和equal?的区别:eq?比较的是指针,而equal?是值。不过要说明的是共享基本符号时,如1,'a这些数字或者变量,eq?是不会区分的;但是如果x和y都指向了'(a b c),(eq? x y)就是#f, 而(equal? x y)就是#t。 本题见图: 3.13 答案没说的,死循环。 稍微有点惊讶的是Drscheme里面对于z的表示:#0=(a b c . #0# ) 5月22日 3.11 答案我理解的书中提到的环境模型的两个原则: 1. 指的就是((acc 'withdraw) 40)这类的求值语句。需要建立一个新框架,把参数/局部变量都作为环境写进去。 2. 指的是(define make-account...)这类的定义语句,也就是书中所说的求值lambda表达式。需要建立一个pair,分别指向代码和环境。 这次的内部定义:书中注脚提到调用同一个过程apply到两个不同的参数时,是共享同一段代码还是各保持一份拷贝,只是个实现细节的问题。而这道题,我假设是共享同一段代码。比如里面acc和acc2的withdraw。 5月19日 大学生超市快一个月没更新了,懒的不行了。期间发现了学校另一个ftp,资源不少,特别是电影。最近还从那看完了The Simpsons的第一季,很有意思的动画片。 今天把2.85的drop改了一半,还是有毛病。 昨天是每年一度的校学生会组织的“大学生超市”——就是毕业生们把不想带走的书或者其他什么小东西,拿出来以很便宜的价格传承给学弟学妹们。只不过今年我们的主要角色变成了善良的商家。我们的标准是除了几本大部头的经典,其他无论定价、装帧、科目,统统五元一本,还随之送过期杂志若干。期间观察那些迷糊的学弟学妹们的行为很有意思,果然跟当时自己啥也不懂时候差不多。比如对单词书很感兴趣,煞有介事的翻来翻去就是不买大部头NB教材,本来这边卖的都快白送了还非要把四块钱砍价到三块,云云。大半天不计成本的甩卖下来,感觉巨爽。事罢,一顿毛式红烧肉收尾。相对于之前那么长时间来对着书发呆,比较有存在感。 |
|
|