【问题标题】:my ordered predicate won't work我的有序谓词不起作用
【发布时间】:2012-05-25 14:55:25
【问题描述】:

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

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

【问题讨论】:

  • Dan 给出了您的程序失败的原因。为了找到这样的错误,DrRacket 中的步进器是一个有用的工具。见stackoverflow.com/questions/10499514/…
  • 函数也可以写成(define (ordered e) (apply > e))。

标签: sorting scheme racket


【解决方案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)))))

【讨论】:

  • @Lara 我用更多细节更新了我的答案,并正确实现了你问题中的代码,看看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多