无法弄清楚“排序”有什么问题

时间:2013-07-03 22:06:22

标签: scheme racket

我试图找出排序列表中两个数字之间的最小差异,所以我想了

 (define (smallest-dif lst)
   (cond
    [(empty? lst) empty]
    [(empty? (rest lst)) (smallest-dif (rest lst))]
    [else (first (sort (cons (-(second lst) (first lst)) (smallest-dif (rest lst)))  <))]))

我的例子是:(最小的差异(5 500 505 600 650 10000)) 但drracket告诉我这个:排序:合同违规   预期:列表?   鉴于:'(50.9350)

我不知道我的代码有什么问题。如果我取出“第一个”,程序可以正常运行。 谁能帮我? THX。

2 个答案:

答案 0 :(得分:1)

让我们看一下代码的这一部分:

(sort (cons (-(second lst) (first lst)) (smallest-dif (rest lst)))  <)

说出您的列表是'(1 2 3)。让我们手工完成部分评估:

(sort (cons (- 2 1) (smallest-dif '(2 3))) <)
(sort (cons 1 (first (sort (cons (- 3 2) (smallest-dif '(2)))  <))) <)
(sort (cons 1 (first (sort (cons 1 empty) <))) <)
(sort (cons 1 1) <)

它试图对一个缺点单元格进行排序,而不是列表,这是它抱怨的合同违规行为。

答案 1 :(得分:1)

您的代码存在的问题是它会排序并占据列表的每个部分的第一部分。您需要将它们拆分为仅返回差异的一个,以及进行排序和拾取的一个。

(define (diffs lst)
  (cond
    [(or (empty? lst) (empty? (rest lst))) empty]
    [else (cons (- (second lst) (first lst)) (diffs (rest lst)))]))

然后你可以制作使用该程序的最小差异,以便选择最小的方式进行排序和选择第一种方法,或者使用min