0

我已经编写了这个函数来“检查”列表是否只包含像这样的 2 个元素对: ((1 2)(3 1)(6 2)) --- (根据第一个元素排序并且不重复第一个元素)。但是我遇到了错误,任何人都可以给出一个想法:

(define Bag?
(lambda setlist
(cond ((null? setlist) '())
      ((and (pair? (caar setlist)) (= (length (caar setlist)) 2)))
        ((> (caar setlist) 0) (< (caar setlist) (car (cdr (car setlist) ))))
        (else(Bag? (cdr setlist))))
    ))
4

1 回答 1

2

列表遍历看起来不正确。错误地声明了它的lambda参数,第二个条件是错误的,你没有在那里推进递归。

最好从头开始。我将在 Racket 中为您提供一个高级解决方案,说明需要检查的内容,您可以根据更简单的程序重写它:

(define (bag? setlist)
  (and (apply < (map car setlist))
       (andmap (lambda (e) (and (pair? e) (= 2 (length e))))
               setlist)))

上面验证了每对中的第一个元素按升序排序,并且列表中的每一对恰好包含两个元素。

于 2013-08-09T04:03:56.493 回答