【问题标题】:The Seasoned Schemer: Intersectall (page 49)经验丰富的计划者:Intersectall(第 49 页)
【发布时间】:2014-06-21 17:18:01
【问题描述】:

The Seasoned Schemer 的第 49 页,我无法理解以下代码中发生了什么(第 14-16 行):

(define intersectall
  (lambda (lset)
    (letcc hop
      (letrec
        ((A (lambda (lset)
              (cond ((null? (car lset)) (hop '()))
                    ((null? (cdr lset)) (car lset))
                    (else (I (car lset)
                             (A (cdr lset)))))))
         (I (lambda (s1 s2)
              (letrec
                ((J (lambda (s1)
                      (cond ((null? s1) '())
                            ((member? (car s1) s2) (J (cdr s1)))  ; (14)
                            (else (cons (car s1)                  ; (15)
                                        (J (cdr s1))))))))        ; (16)
                 (cond ((null? s2) '())
                       (else (J s1)))))))
         (cond ((null? lset) '())
               (else (A lset)))))))

我的疑问在第 14 行:

((member? (car s1) s2) (J (cdr s1)))

如果(car s1)s2 的成员,不应该将其包含在结果中吗?同样,在第 15 和 17 行:

(else (cons (car s1) (J (cdr s1))))))))

如果它不是s2 的成员,不应该将其跳过进入结果吗?

【问题讨论】:

    标签: functional-programming scheme lisp seasoned-schemer


    【解决方案1】:

    没关系...这是一个错误:

    http://www.ccs.neu.edu/home/matthias/BTSS/errata.html

    第 13 章

    第 49 页:A4:交换 J 的 cond 的最后两个子句的答案

    第 50 页:Q2:交换 J 的 cond 的最后两个子句的答案

    【讨论】:

    • 这是一个很好的问题,你很好地解释了混乱,但由于这是一个简单的错误,删除这个问题可能是有意义的,因为它可能对你没有太大帮助其他用户。 (不过,如果您不删除它,请务必接受您的回答。)
    • 每当我在这本书系列中发现困难的主题时,我一直依靠 Stack Overflow 作为学习辅助工具。所以我想它也会对其他人有所帮助。我会接受答案。
    猜你喜欢
    • 2012-06-21
    • 2023-03-10
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多