問題3.17 – SICP(計算機プログラムの構造と解釈)その117

問題3.17

一度数えた対を記録して保持し、カウント直前にチェックを行う。

(define (make-count-pairs walks)
  (define (count-pairs x)
    (cond ((not (pair? x)) 0)
          ((memq x walks) 0)
          (else
            (set! walks (cons x walks))
            (+ (count-pairs (car x))
               (count-pairs (cdr x))
               1))))
  count-pairs)

(define CP (make-count-pairs '()))

(define x (cons 'a (cons 'b (cons 'c '()))))
(CP x)
gosh> 3
(display x)
gosh> (a b c)#<undef>

(define x (cons 'd (cons 'a '())))
(set-car! x (cons 'b (cdr x)))
(CP x)
gosh> 3
(display x)
gosh> ((b a) a)#<undef>

(define x (cons 'a (cons 'b (cons 'c '()))))
(set-car! (cdr x) (cdr (cdr x)))
(set-car! x (cdr x))
(CP x)
gosh> 3
(display x)
gosh> (((c) c) (c) c)#<undef>
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»