#t
如果列表e
是递增排序的,则该函数应该返回。该功能不起作用,我无法修复它。
(define (ordered e)
(if (or (null? e) (> length(e) 1))
#t
(if (> (car e) (cadr e))
#f
(ordered (cdr e)))))
问题中的基本情况是错误的,如果列表的元素少于两个,则简单地声明一个列表是有序的会更容易(并且不易出错)。这就是导致代码出现问题的原因,因为基本情况定义不明确,您的过程在不应该进入第二种情况时进入。当列表的元素少于两个时,您不能使用cadr
. 要修复您的实现,请执行以下操作:
(define (ordered e)
(if (< (length e) 2)
#t
(if (> (car e) (cadr e))
#f
(ordered (cdr e)))))
您可以通过 using 更简洁地表达此问题的解决方案cond
,并且可以避免使用length
(取决于实现可能是O(n)
操作),如下所示:
(define (ordered e)
(cond ((or (null? e) (null? (cdr e))) #t)
((> (car e) (cadr e)) #f)
(else (ordered (cdr e)))))