0

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

 (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)))  <))]))

我的示例是: (smallest-dif '(5 500 505 600 650 10000)) 但 drracket 告诉我:排序:预期违反合同:列表?给定:'(50 . 9350)

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

4

2 回答 2

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

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

于 2013-07-03T22:17:35.140 回答
1

您的代码的问题在于它对列表的每个部分进行排序并获取第一个部分。您需要将它们分成只返回差异的一个和一个进行排序和挑选的。

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

然后,您可以制作使用该过程的最小差异,以便按照排序和选择第一个的方式选择最小的,或者您可以使用min.

于 2013-07-03T22:36:05.843 回答