我试图检查列表是否已排序。如果已排序,则返回True,否则返回False。但是,此代码始终返回True,我不确定如何修复它。
(define (ordered? lst)
(cond (if (null? lst) #t)
((> (car(cdr(lst))) car(lst))
(apply increasing? cdr(lst)))
(else #f))
)
答案 0 :(得分:0)
您不在if
内使用cond
。第一行应该是:
(cond ((null? lst) #t)
您的代码正在测试if
是否为真。由于这始终为真,因此处理了该子句并返回#t
。
答案 1 :(得分:0)
让我们考虑您的代码正在做什么。
首先摆脱if
在cond
子句中没有必要。接下来你有一些非方案函数调用:
((> (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))
)