我要通过“小策士”的书,并做各种功能。一般来说,我结束与版本相同的书籍,但不能用于eqlist?,这是一个功能来测试两个列表的相等性。

我已经试过我的测试版本,并将其传递什么,我在它扔。然而,它是从“小策士”的版本略有不同,我想我是否失去了一些东西别人的意见 - 我怀疑这样的话

我的版本:

(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 2 . 3))作为参数。 (注意它的工作与'(),当然 - 不知道TLS认为这是一个原子或不)。这使得你的功能其实更强劲,虽然可能更好名为eqv? / equal?eqlist?。 (I见equal?eqan?用于测试数字平等,但传统上这个名字是连接到通用值相等的测试功能。)

基本上,你的eqlist?工作的假设下,任何类型的论点,即(1)atom?能够告诉对非对(与carcdr的东西)(这是pair?的否定版本),(2)eqan?测试原子的平等,(3)一切是要么'()或一对或原子。 (嗯,其实'()在我眼里的原子 - 和小切斯方案一致)。这本书的版本适用于适当的列表(包括'()),使得类似的假设和忽略遇到不当名单的可能性

我也不会,如果一个更强大的平等测试函数在本书后面提出的惊讶,但我没有它可用于检查。无论如何,你贴eqlist?书版看起来似乎意在说明基本思路名单的背后,不是你预期的要在一天到一天的编程使用的东西。事实上,eqan?的给定版本将打破以不受限制的环境下,有更多的原子类型的数据的考虑,其中起码字符串将需要单独核算,因而无效在上述第二款所列的假设和打破eqlist?的两个版本。

其他提示

这里是我的版本:

(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)))))))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top