2013-07-03 124 views
0

我试图找出一个排序列表之间的两个数字相差最小,所以我WIRTE无法弄清楚什么是错的“排序”

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

我的例子是:(最小-DIF '(5 500 505 600 650 10000)) 但drracket告诉我这样:排序:违反合同 预计:列表? 给出:'(50.9350)

我不知道我的代码有什么问题。如果我拿出“第一”,程序可以正常运行。 任何人都可以帮助我吗?谢谢。

回答

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单元,而不是一个名单,这是违反合同它在抱怨。

+0

Aww,没想到这一点。非常感谢。 – user2185071

1

您的代码存在的问题是,它会对列表的每个部分进行排序并将其排序。你需要把它们分解成一个返回差异和一个进行排序和挑选的差异。

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

然后你就可以使用,以接你用分类和挑选第一或者你可以使用min做最小的两种方式,程序的最小-DIF。

+0

是的,我知道了。谢谢 – user2185071

+0

@WorBlux有趣,但如何? – user2185071

+0

不,我觉得有点像折叠,但你有两个不同的操作,一个在列表的前两个。 (定义(pairwise-fold-left pair-op op end-term lst)(if(或(null?lst)(null?(cdr lst))end-term(op(pair-op(fist lst)(second lst ))(pairwise-fold-left pair-op op end-term(cdr lst)))))(define(diffs lst)(pairwise-fold-left - cons lst))。 – WorBlux