检查列表是否按Scheme排序

时间:2014-11-02 06:28:06

标签: list debugging sorting scheme

我试图检查列表是否已排序。如果已排序,则返回True,否则返回False。但是,此代码始终返回True,我不确定如何修复它。

(define (ordered? lst)
    (cond (if (null? lst) #t)
          ((> (car(cdr(lst))) car(lst))
           (apply increasing? cdr(lst)))
          (else #f))
)

2 个答案:

答案 0 :(得分:0)

您不在if内使用cond。第一行应该是:

(cond ((null? lst) #t)

您的代码正在测试if是否为真。由于这始终为真,因此处理了该子句并返回#t

答案 1 :(得分:0)

让我们考虑您的代码正在做什么。

首先摆脱ifcond子句中没有必要。接下来你有一些非方案函数调用:

      ((> (car(cdr(lst))) car(lst))

应该是:

  ((> (car (cdr lst)) (car lst))

现在,您通常不会以这种方式使用apply。相反,我会使用递归。

所以这个:

       (apply increasing? cdr(lst)))

变为:

    (ordered (cdr lst)))

考虑一下这是做什么的,我正在检查列表的其余部分是否有序,如果在某些地方没有,那么这个表达式将评估为false,表达式的其余部分也将如此。

接下来我们要检查一下这个特定实例没有排序的情况:

  (else #f))

很好。

总而言之:

(define (ordered? lst)
      (cond ((null? lst) #t)
            ((eq? (length lst) 1) #t)
      ((> (car (cdr lst)) (car lst))
        (ordered? (cdr lst)))
      (else #f))
     )