삽입 정렬 코드입니다.
이 코드를 잘 이해해야 제가 손수 코드를 작성할 수 있는데,
대강은 이해가 가지만 자세한 작동 원리나 논리가 궁금합니다.
아래는 코드입니다.
(defun insert (item lst &optional (i #'<))
;insert라는 이름의 함수를 정의한다.
;&optional은 뒤의 값을 optional로 설정한다.
;선택전 매개변수를 지정하는 것이다.
;함수에 옵션변수를 넣기 위해서는 &optional (변수명 디폴트값)을 이용한다.
;insert함수에서 item값과 lst값은 있어야 하지만 그 뒤의 값은 optional하다.
(if (null lst)
(list item)
(if (funcall i item (car lst))
(cons item lst)
(cons (car lst) (insert item (cdr lst) i)))))
;cons 함수는 원소와 리스트를 취하고 그 원소를 첫 번째 요소로 포함시킨 새로운 리스트를 만들어준다.
;funcall은 (funcall fn a1 a2……an)은 인자
; a1,a2,an으로 함수 fn에 제공한다.
(defun insertionsort (lst &optional (i #'<))
;여기서도.lst의 값을 제외하면 뒤의 값은 옵셔널하다.
(if (null lst) ;lst가 비어 있다면
lst
(insert (car lst) (insertionsort (cdr lst) i) i))
)
;이 때, 재귀를 쓴다. item 항목은 (lst)의 첫번째 부분이다.
;car 함수는 첫번째 내용을 보여주는 것이고
;cdr 함수는 처음 것을 제외한 것을 보여준다.
;#’ 은 그냥 ‘와 비슷한 놈인데, function val과 같은 의미이다.
(print(insertionsort ‘(1 4 2 4 5 1 3 0)))
:출력 시 0 1 1 2 3 4 4 5 가 나옴.
1 답변