(sicp16)m2.40

今日はこれだけ

  • enumerate-intervalがenumerate-improverになってる
;;m2.40
(define (enumerate-improver low high)
  (if (> low high)
      '()
      (cons low (enumerate-improver (+ low 1) high))))

(define (unique-pairs n)
  (define (iter result count)
    (if (= count 0)
        result
        (iter (append (map (lambda (x) (list count x))
                           (enumerate-improver 1 (- count 1)))
                      result)
              (- count 1))))
  (iter '() n))
;たぶん違うことしているけど、一応求められているように動く。
;	gosh> (unique-pairs 5)
;	((2 1) (3 1) (3 2) (4 1) (4 2) (4 3) (5 1) (5 2) (5 3) (5 4))

;;prime-sum-pairsをの定義を簡単にする。
;必要な関数。;;;;;;;;;;;
(define (prime-sum? pair)
  (prime? (+ (car pair) (cadr pair))))

(define (make-pair-sum pair)
  (list (car pair) (cadr pair) (+ (car pair) (cadr pair))))

(define (filter ok? seq)
  (if (null? seq)
      '()
      (if (ok? (car seq))
          (cons (car seq) (filter ok? (cdr seq)))
          (filter ok? (cdr seq)))))

(define (tiny-prime? n)
  (define (iter count)
    (cond ((= n count) #t)
          ((= 0 (remainder n count)) #f)
          (else (iter (+ count 1)))))
  (cond ((= n 1) #t)
        ((<= n 2) #f)
        (else (iter 2))))

(define prime? tiny-prime?)
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (prime-sum-pairs n)
  (map make-pair-sum
       (filter prime-sum? (unique-pairs n))))
;	gosh> (prime-sum-pairs 7)
;	((2 1 3) (3 2 5) (4 1 5) (4 3 7) (5 2 7) (6 1 7) (6 5 11) (7 4 11) (7 6 13))