(sicp16+)やっぱりもう1問した。
improver -> intervalに直した。
;;m2.41 ;n>=k>j>iで総和がs ;今回は教科書に沿って,flatmapを使ってみよう ; ;;;;;;;;必要なもの(教科書);;;;;;;;;;;;;;;; (define (flatmap proc seq) (accumulate append '() (map proc seq))) (define (accumulate op init seq) (if (null? seq) init (op (car seq) (accumulate op init (cdr seq))))) ;;あと、ふつうのunique-pairsも (define (usually-unique-pairs n) (flatmap (lambda (i) (map (lambda (j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n))) ; ;;;;;;;;;;;;;;;;;;;;;;; (define (unique3-sum-is-s n s) (define (sum-equal-s? seq) (= s (cadddr seq))) ;;last-elemntのような関数を作ってみても良いかもしれない。 (define (make-eachelements-and-sum seq) (map (lambda (xs) (append xs (list (accumulate + 0 xs)))) seq)) (define unique-3 (flatmap (lambda (i) (map (lambda (j) (cons i j)) (unique-pairs (- i 1)))) (enumerate-interval 1 n))) (filter sum-equal-s? (make-eachelements-and-sum unique-3))) ; gosh> (unique3-sum-is-s 6 13) ; ((6 4 3 13) (6 5 2 13))
あー、勘違いしていた。
合計はリストの中に入ってないじゃないか。
(define (hontoha-kocchi n s) (filter (lambda (xs) (= s (accumulate + 0 xs))) (flatmap (lambda (i) (map (lambda (j) (cons i j)) (unique-pairs (- i 1)))) (enumerate-interval 1 n)))) ; gosh> (hontoha-kocchi 10 12) ; ((5 4 3) (6 4 2) (6 5 1) (7 3 2) (7 4 1) (8 3 1) (9 2 1))