unique-pairs 프로시저는 서로 다른 두 개의 정수를 뽑아냈지만,

이 문제에서 만들어야 할 프로시저는 서로 다른 세 개의 정수를 내놓아야합니다.

그 정수가 되는 조건은 그 합이 s가 되어야 합니다.

 

c15

잘 작동하는군요.^^

 

프로시저는 이렇게 만들었습니다.

먼저 어떤 정수보다 작은 서로 다른 세 개의 정수를 뽑아내는

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)

크리에이티브 커먼즈 라이선스
Creative Commons License
TAG , , ,

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1348

댓글을 달아 주세요

[로그인][오픈아이디란?]