2014-11-03 2 views
1

나는 현재 두 개의 목록의 내용을 비교하여 정렬하고 맹종별로 정렬 된 하나의 목록을 만드는 함수를 작성하려고합니다. 예를 들어두리스트를 LISP에서 재귀 적으로 비교하기

(4 6 8 9 10) (2 5 7 9 1) 나는이 있어야한다는 기대 (1 2 3 4 5 6 7 8 9 9 10)

우리는 재귀 작업하는 것처럼 될 것 재귀 적으로 행해진 다. LISP에 대한 나의 지식은 제한적이며, 나는 이것을 크게 고심하고있다. 어떤 도움을 주시면 감사하겠습니다.

+2

는 지금까지 시도 할 경우는 어떻게? 기본 케이스를 찾아 봅니다. - 어떤 입력이 출력을 생성하는지 알지 못합니다 (힌트 : 출력이 입력 중 하나 일 수 있음). 기본 사례를 다루었 으면 재귀 호출을하기 전에 수행 할 작업을 생각하십시오. –

+1

귀하의 질문에 구현하고자하는 알고리즘과 지금까지 시도한 알고리즘에 대한 정보가 부족합니다. 당신이 설명하는 것은 Lisp과 독립적이며 많은 프로그래밍 언어로 작성 될 수 있습니다. –

+0

현재 나는 서로 추가 된 첫 번째와 두 번째 목록 인 세 번째 목록을 만들려고합니다. 그런 다음 삽입 정렬을 수행합니다. 그러나 목록 자체를 만드는 데 어려움을 겪습니다. – JT93

답변

1

병합이라고합니다.

항상 각 목록의 첫 번째 요소를보고 낮은 요소를 가져 와서 새 목록을 작성합니다.

2

직접 구현할 필요가 없습니다. 커먼 리스프는 함수 merge 있습니다

CL-USER> (merge 'list '(4 6 8 9 10) '(1 2 5 7 9) '<) 
(1 2 4 5 6 7 8 9 9 10) 
1

당신이 반복적으로 다음을 수행 할 당신이

(defun merge1 (ls1 ls2) 
    (cond ((null ls1) ls2) 
     ((null ls2) ls1) 
     ((< (car ls1) (car ls2)) 
     (cons (car ls1) 
       (merge1 (cdr ls1) ls2))) 
     (t (cons (car ls2) 
       (merge1 ls1 (cdr ls2))))))