我的有序谓词不起作用

时间:2012-05-25 14:55:26

标签: sorting scheme racket

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

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

1 个答案:

答案 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)))))