2014-11-06 69 views
0

我有一個合併排序函數,它接受一個謂詞和一個真實值列表,然後根據謂詞對它們進行排序。例如合併排序輸出 - 方案

(merge-sort > '(1 7 4 6)) 
    ---> (7 6 4 1) 

我的問題是給定的關聯列表:

(define *Mark* 
    '((age . 20) 
     (gender . male)) 

(define *Judith* 
    '((age . 30) 
     (gender . female)) 

(define *Elliot* 
    '((age . 40) 
     (gender . male)) 

已被用於創建一個無序列表(馬克·埃利奧特朱迪思),如何使用他們的年齡在合併排序

(merge-sort > '(20 40 30)) ---> (40 30 20) 

我可以輸出的有序列表

(Elliot Judith Mark) 
+0

@chris的回答是正確的。如果你想獲得真實的名字。您必須將其添加到關聯列表中。並且做一些像'map get-name(merge-sort ...)' – Rptx 2014-11-06 12:43:15

回答

2
(merge-sort (lambda (a b) 
       (define (get-age x) 
       (cdr (assq 'age x))) 
       (> (get-age a) (get-age b))) 
      (list *Mark* *Judith* *Elliot*)) 
+1

你的問題和Chris的回答是一個很好的例子,爲什麼Racket的'sort'有一個可選的'#:key'參數:你可以提供一個像'get-age'或'(撰寫cdr(咖喱醬)')。向你的'merge-sort'添加一個類似的選項可能是值得的。 – 2014-11-06 13:01:28

+0

@GregHendershott我寧願使用Clojure的'#(cdr(assq'age%))'語法! https://gist.github.com/cky/8500450 – 2014-11-06 13:03:49

+0

是的,雖然我認爲Haskell可能贏得組合和部分應用語法。 :P無論如何,我的觀點是,對於一個排序函數來說,接受一個可選的「提取鍵」函數(然而用戶定義函數:))是很方便的。這樣,用戶可以提供「如何獲得關鍵」部分,而不是整個「如何比較兩件事」部分。 – 2014-11-06 13:27:20