unique-pairs 프로시저는 서로 다른 두 개의 정수를 뽑아냈지만,
이 문제에서 만들어야 할 프로시저는 서로 다른 세 개의 정수를 내놓아야합니다.
그 정수가 되는 조건은 그 합이 s가 되어야 합니다.

잘 작동하는군요.^^
프로시저는 이렇게 만들었습니다.
먼저 어떤 정수보다 작은 서로 다른 세 개의 정수를 뽑아내는
unique-triples를 만들었습니다.
이 프로시저는 unique-pairs에서 큰 값을 하나씩 추가하는 방식을 썼습니다.
그 후에 sum-triples는 n과 s를 받아 문제에서 나오는 정의에 맞추어 만들었습니다.
처음에는 unique-pairs 프로시저 본문을 수정하고자 하였으나
리스트의 리스트의 리스트라는 이상한 형식이 되어서
unique-pairs의 값에 하나를 더 넣는 방법을 선택하였습니다.
그렇다면 여러 쌍을 반환하는 unique-n-pairs도 가능할 듯싶습니다.^^
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 162
; accumulate
(define (accumulate op initial sequence)
(if (null? sequence)
initial
(op (car sequence)
(accumulate op initial (cdr sequence)))))
; enumerate-interval
(define (enumerate-interval low high)
(if (> low high)
null
(cons low (enumerate-interval (+ low 1) high))))
; flapmap
(define (flatmap proc seq)
(accumulate append null (map proc seq)))
; unique-pairs
(define (unique-pairs n)
(flatmap (lambda (i)
(map (lambda (j) (list i j))
(enumerate-interval 1 (- i 1))))
(enumerate-interval 1 n)))
; filter
(define (filter predicate sequence)
(cond ((null? sequence) null)
((predicate (car sequence))
(cons (car sequence)
(filter predicate (cdr sequence))))
(else (filter predicate (cdr sequence)))))
; unique-triples
(define (unique-triples n)
(flatmap (lambda (jk)
(if (< (car jk) n)
(map (lambda (i)
(cons i jk))
(enumerate-interval (+ 1 (car jk)) n))
null))
(unique-pairs n)))
; answer
(define (sum-triples n s)
(filter (lambda (ijk)
(= s (+ (car ijk) (cadr ijk) (cadr (cdr ijk)))))
(unique-triples n)))
; execute
(unique-pairs 5)
(unique-triples 5)
(newline)
(sum-triples 5 6)
(sum-triples 5 10)
- SICP Exercise 연습문제 2.46 (0)2008/02/20
- SICP Exercise 연습문제 2.45 (0)2008/02/20
- SICP Exercise 연습문제 2.44 (0)2008/02/17
- SICP Exercise 연습문제 2.41 (0)2008/02/16
- SICP Exercise 연습문제 2.40 (0)2008/02/16
- SICP Exercise 연습문제 2.39 (0)2008/02/11
- SICP Exercise 연습문제 2.38 (0)2008/02/11
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.







댓글을 달아 주세요