我试图找出排序列表中两个数字之间的最小差异,所以我想了
(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。
答案 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
。