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