我试图检查列表是否排序。如果它被排序,则返回True,否则返回False。但是,这段代码总是返回True,我不知道如何解决它。检查一个列表是否按计划排序
(define (ordered? lst)
(cond (if (null? lst) #t)
((> (car(cdr(lst))) car(lst))
(apply increasing? cdr(lst)))
(else #f))
)
我试图检查列表是否排序。如果它被排序,则返回True,否则返回False。但是,这段代码总是返回True,我不知道如何解决它。检查一个列表是否按计划排序
(define (ordered? lst)
(cond (if (null? lst) #t)
((> (car(cdr(lst))) car(lst))
(apply increasing? cdr(lst)))
(else #f))
)
让我们来思考你的代码在做什么。
首先摆脱if
在cond
条款中是没有必要的。接下来,您有一些非计划函数调用回事:
((> (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))
)
不要使用if
内cond
。第一行应该是:
(cond ((null? lst) #t)
您的代码是测试if
是否为true。由于这总是正确的,所以该子句被处理并返回#t
。
这给了我的命令绑定变量的错误,因为我没有定义排序。所以我改变命令?但我得到另一个错误,说“汽车:错误的论点类型”。 – sunnysmiling 2014-11-02 06:51:02
哦,是的,你也必须担心单身名单...我更新了所有。 – Dair 2014-11-02 06:56:45