SICP 연습문제 2.28 친절한 풀이

문제

(리스트로 나타낸) 나무를 인자로 받아서, 모든 나뭇잎을 왼쪽에서 오른쪽으로 늘어놓은 리스트를 결과로 내놓는 fringe 프로시저를 정의하라. fringe 프로시저를 만들어 돌려보았을 때 그 결과는 아래와 같다.

(define x (list (list 1 2) (list 3 4)))

(fringe x)
>>> (1 2 3 4)

(fringe (list x x))
>>> (1 2 3 4 1 2 3 4)

문제로 부터 얻은 것

반복하는 프로시저를 만들 때에는 핵심 반복의 논리를 먼저 구현한 후에, 나머지 자투리 처리를 하는 것이 좋은 전략인 것 같습니다. 예를 들어 이 문제의 핵심 반복의 논리는 fringe끼리 append하는 것입니다.
반성을 조금 하자면, 처음부터 계획을 세우고 코드를 짜는 것이 아닌 일단 짜놓고 "어 안되네? 이렇게 해볼까?"같은 식으로 코딩을 해왔던 것 같습니다. 이렇게 해서는 실력이 늘지 않을 것 같습니다. 다음부터는 실행 버튼을 누르기 전에 머리속으로 시뮬레이션을 돌려서 무지성 코딩을 최대한 막아야 겠습니다.

문제풀이

제가 구상한 fringe 프로시저의 원리는 다음과 같습니다.

  1. items를 받아서 만약 첫번째 원소가 pair라면, 첫번째 원소를 fringe하고 그 다음 리스트들을 fringe한 것과 append한다.
    (append (fringe (car items)) (fringe (cdr items)))
  2. items를 받아서 만약 첫번째 원소가 pair가 아니라면, 그 다음 리스트들을 fringe한것의 앞에 끼워 넣는다.
    (cons (car items) (fringe (cdr items)))
  3. 받은 items가 nil이라면, nil을 반환한다.
    ((null? items) nil)
(define (fringe items)
(cond ((null? items) nil)
((pair? (car items))
(append (fringe (car items))
(fringe (cdr items))))
(else (cons (car items) (fringe (cdr items))))))



문제의 테스트 코드에 잘 동작하는 모습



읽어주셔서 감사합니다.