SICP 연습문제 2.28 친절한 풀이
문제
(리스트로 나타낸) 나무를 인자로 받아서, 모든 나뭇잎을 왼쪽에서 오른쪽으로 늘어놓은 리스트를 결과로 내놓는 fringe 프로시저를 정의하라. fringe 프로시저를 만들어 돌려보았을 때 그 결과는 아래와 같다.
(define x (list (list 1 2) (list 3 4))) |
문제로 부터 얻은 것
반복하는 프로시저를 만들 때에는 핵심 반복의 논리를 먼저 구현한 후에, 나머지 자투리 처리를 하는 것이 좋은 전략인 것 같습니다. 예를 들어 이 문제의 핵심 반복의 논리는 fringe끼리 append하는 것입니다.
반성을 조금 하자면, 처음부터 계획을 세우고 코드를 짜는 것이 아닌 일단 짜놓고 "어 안되네? 이렇게 해볼까?"같은 식으로 코딩을 해왔던 것 같습니다. 이렇게 해서는 실력이 늘지 않을 것 같습니다. 다음부터는 실행 버튼을 누르기 전에 머리속으로 시뮬레이션을 돌려서 무지성 코딩을 최대한 막아야 겠습니다.
문제풀이
제가 구상한 fringe 프로시저의 원리는 다음과 같습니다.
- items를 받아서 만약 첫번째 원소가 pair라면, 첫번째 원소를 fringe하고 그 다음 리스트들을 fringe한 것과 append한다.
(append (fringe (car items)) (fringe (cdr items))) - items를 받아서 만약 첫번째 원소가 pair가 아니라면, 그 다음 리스트들을 fringe한것의 앞에 끼워 넣는다.
(cons (car items) (fringe (cdr items))) - 받은 items가 nil이라면, nil을 반환한다.
((null? items) nil)
(define (fringe items) |
읽어주셔서 감사합니다.