2014-11-06 5 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

답변

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 (curry assq 'age)를 작성하십시오'). 'merge-sort'에 비슷한 옵션을 추가하는 것은 가치가 있습니다. –

+0

@GregHendershott Clojure의'# (cdr (assq 'age %)) 구문을 사용하고 싶습니다! https://gist.github.com/cky/8500450 –

+0

그래, 하스켈이 작곡과 부분적인 응용 문법을 위해 이길지도 모른다. : P 어쨌든 필자의 요점은 선택적인 "키 추출"기능을 사용할 수있는 정렬 함수를 사용하는 것이 편리하다는 것이다. 이렇게하면 사용자는 "두 가지를 비교하는 방법"부분 대신 전체 "핵심을 얻는 방법"부분 만 제공 할 수 있습니다. –