如何检查列表是否只包含使用Scheme的已排序(w.r.t第一个元素)2元素对?

时间:2013-08-09 03:17:29

标签: list sorting scheme

我已经写了这个函数来'检查'列表是否只包含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))))
    ))

1 个答案:

答案 0 :(得分:2)

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

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

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

以上验证每对中的第一个元素是按升序排序的,并且列表中的每个元素都包含两个元素。