我已经写了这个函数来'检查'列表是否只包含2个元素对,如下所示:((1 2)(3 1)(6 2))---(根据第一个元素排序& no重复第1个元素)。但我收到错误,有人可以提出一个想法:
(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))))
))
答案 0 :(得分:2)
列表遍历看起来不正确。 lambda
错误地声明了它的参数,第二个条件错了,你没有推进那里的递归。
最好从头开始。我将在Racket中为您提供一个高级解决方案,说明需要检查的内容,您可以根据更简单的程序重写它:
(define (bag? setlist)
(and (apply < (map car setlist))
(andmap (lambda (e) (and (pair? e) (= 2 (length e))))
setlist)))
以上验证每对中的第一个元素是按升序排序的,并且列表中的每个元素都包含两个元素。