(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))