三分 的个人资料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。

本题见图:

5月25日

3.14 答案

(mystery x)返回的相当于原来的(reverse x)

题目中的v返回(a),w返回(d c b a)
具体见图:(不同颜色指运行到不同阶段,顺序是红、蓝、绿、紫)

3.13 答案

没说的,死循环。
稍微有点惊讶的是Drscheme里面对于z的表示:#0=(a b c . #0# )

3.12 答案

第一个返回(b)  第二个返回(b c d)
很好理解,见图:

5月22日

3.11 答案

我理解的书中提到的环境模型的两个原则:
1. 指的就是((acc 'withdraw) 40)这类的求值语句。需要建立一个新框架,把参数/局部变量都作为环境写进去。
2. 指的是(define make-account...)这类的定义语句,也就是书中所说的求值lambda表达式。需要建立一个pair,分别指向代码和环境。

这次的内部定义:书中注脚提到调用同一个过程apply到两个不同的参数时,是共享同一段代码还是各保持一份拷贝,只是个实现细节的问题。而这道题,我假设是共享同一段代码。比如里面acc和acc2的withdraw。


3.9 答案

第二章的东西又先放放了…先整点简单的
图是用dia画的,感觉还不错(嗲...)
就像书中说的,返回值在调用之间传递的问题还不清楚,现在只是把环境模型画出来。


5月19日

大学生超市

快一个月没更新了,懒的不行了。期间发现了学校另一个ftp,资源不少,特别是电影。最近还从那看完了The Simpsons的第一季,很有意思的动画片。

今天把2.85的drop改了一半,还是有毛病。

昨天是每年一度的校学生会组织的“大学生超市”——就是毕业生们把不想带走的书或者其他什么小东西,拿出来以很便宜的价格传承给学弟学妹们。只不过今年我们的主要角色变成了善良的商家。我们的标准是除了几本大部头的经典,其他无论定价、装帧、科目,统统五元一本,还随之送过期杂志若干。期间观察那些迷糊的学弟学妹们的行为很有意思,果然跟当时自己啥也不懂时候差不多。比如对单词书很感兴趣,煞有介事的翻来翻去就是不买大部头NB教材,本来这边卖的都快白送了还非要把四块钱砍价到三块,云云。大半天不计成本的甩卖下来,感觉巨爽。事罢,一顿毛式红烧肉收尾。相对于之前那么长时间来对着书发呆,比较有存在感。