【问题标题】:Little Schemer eqlist? function - alternate version?小计划者均衡器?功能 - 替代版本?
【发布时间】:2010-03-04 11:06:28
【问题描述】:

我正在阅读“Little Schemer”一书,并执行各种功能。一般来说,我最终会得到与书籍相同的版本,但不是 eqlist?,这是一个测试两个列表是否相等的函数。

我试过测试我的版本,它通过了我扔给它的任何东西。然而,它与“Little Schemer”版本略有不同,我希望有人对我是否遗漏一些东西提出意见 - 我怀疑是这样。

我的版本:

(define eqlist?
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2))#t)
      ((or (null? list1)(null? list2))#f)
      ((and (atom? list1)(atom? list2))(eqan? list1 list2))
      ((or (atom? list1)(atom? list2)) #f)
      (else
        (and(eqlist? (car list1) (car list2))
            (eqlist? (cdr list1) (cdr list2)))))))

本书的版本:

(define eqlist2? ;This is Little Schemer's version
  (lambda (list1 list2)
    (cond
      ((and (null? list1)(null? list2)) #t)
      ((or (null? list1)(null? list2)) #f)
      ((and (atom? (car list1))(atom? (car list2)))
       (and (eqan? (car list1)(car list2))(eqlist2? (cdr list1)(cdr list2))))
      ((or (atom? (car list1))(atom? (car list2))) #f)
      (else
       (and (eqlist2? (car list1)(car list2))
            (eqlist2? (cdr list1)(cdr list2)))))))

在这两种情况下,eqan 的定义是:

(define eqan?
  (lambda (a1 a2)
    (cond
      ((and (number? a1)(number? a2)) (equal? a1 a2))
      ((or (number? a1)(number? a2)) #f)
      (else (eq? a1 a2)))))

谢谢!

乔斯·德拉格

【问题讨论】:

  • +1 来自 The Little Schemer 的问题 :-)

标签: scheme the-little-schemer


【解决方案1】:

如果传入一个原子或不正确的列表(一对不是列表——类似于(1 2 . 3))作为参数,则书籍版本会中断。 (请注意,它确实适用于 '(),当然——不确定 TLS 是否认为这是一个原子。)这使您的函数实际上更健壮,尽管命名为 eqv? / equal? 可能比 @987654325 更好@。 (我看到equal?eqan? 中用于测试数值相等性,但传统上这个名称附加到一个通用值相等性测试函数。)

基本上,您的 eqlist? 可以处理任何类型的参数,前提是 (1) atom? 能够区分非对(它是否定版本)对(carcdr 的事物) pair?),(2) eqan? 测试原子的相等性,(3) 一切要么是'(),要么是一对或一个原子。 (好吧,实际上'() 在我眼中是一个原子——Petite Chez Scheme 同意。)本书版本适用于正确的列表(包括'()),做出类似的假设并忽略遇到不正确列表的可能性。

如果本书后面介绍了更强大的相等性测试功能,我不会感到惊讶,但我没有它可供检查。无论如何,您发布的eqlist? 的书本版本似乎是为了说明列表背后的基本思想,而不是您真正想要在日常编程中使用的东西。事实上,eqan? 的给定版本将在一个不受限制的环境中中断,在该环境中需要考虑更多原子类型的数据,其中至少需要单独考虑字符串,从而使第二段中列出的假设无效以上并破坏了eqlist?的两个版本。

【讨论】:

    【解决方案2】:

    这是我的版本:

    (define eqlist?
        (lambda (l1 l2)
          (cond
            ((and (null? l1) (null? l2))
             #t)
            ((and (atom? (car l1)) (atom? (car l2)))
             (and (eq? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2))))
            (else
             (and (eqlist? (car l1) (car l2)) (eqlist? (cdr l1) (cdr l2)))))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      • 2019-04-28
      • 2017-09-27
      • 2020-09-02
      相关资源
      最近更新 更多