2014-11-02 39 views
0

我试图检查列表是否排序。如果它被排序,则返回True,否则返回False。但是,这段代码总是返回True,我不知道如何解决它。检查一个列表是否按计划排序

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

回答

0

让我们来思考你的代码在做什么。

首先摆脱ifcond条款中是没有必要的。接下来,您有一些非计划函数调用回事:

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

应该是:

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

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

所以这样的:

 (apply increasing? cdr(lst))) 

变为:

(ordered (cdr lst))) 

一些想想这是什么做的,如果该列表的其余部分是有序的,我检查,如果它不是,这个表达式将被评估为false,表达式的其余部分也将被评估为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)) 
    ) 
+0

这给了我的命令绑定变量的错误,因为我没有定义排序。所以我改变命令?但我得到另一个错误,说“汽车:错误的论点类型”。 – sunnysmiling 2014-11-02 06:51:02

+0

哦,是的,你也必须担心单身名单...我更新了所有。 – Dair 2014-11-02 06:56:45

0

不要使用ifcond。第一行应该是:

(cond ((null? lst) #t) 

您的代码是测试if是否为true。由于这总是正确的,所以该子句被处理并返回#t

相关问题