2013-07-03 126 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