2

#t如果列表e是递增排序的,则该函数应该返回。该功能不起作用,我无法修复它。

(define (ordered e)
  (if (or (null? e) (> length(e) 1))
      #t
      (if (> (car e) (cadr e))
          #f
          (ordered (cdr e)))))
4

1 回答 1

1

问题中的基本情况是错误的,如果列表的元素少于两个,则简单地声明一个列表是有序的会更容易(并且不易出错)。这就是导致代码出现问题的原因,因为基本情况定义不明确,您的过程在不应该进入第二种情况时进入。当列表的元素少于两个时,您不能使用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)))))
于 2012-05-25T15:34:32.173 回答