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

問題3.16

最初の count-pairs を実行する際に、カウント1。
(car x)(cdr x) のそれぞれのポインタが指し示す先が対(pair)である場合に、カウント1。

ポインタの指し示す先が同じ場合に count-pairs が重複して実行される。

SICP 問題3.16

(define (count-pairs x)
  (if (not (pair? x))
      0
      (+ (count-pairs (car x))
         (count-pairs (cdr x))
         1)))

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

(define x (cons 'd (cons 'a '())))
(set-car! x (cons 'b (cdr x)))
(count-pairs x)
gosh> 4
(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))
(count-pairs x)
gosh> 7
(display x)
gosh> (((c) c) (c) c)#<undef>

(define (make-cycle x)
  (set-cdr! (last-pair x) x)
  x)

(define x (cons 'a (cons 'b (cons 'c '()))))
(make-cycle x)
gosh> #0=(a b c . #0#)
(count-pairs x)
;無限ループに入る
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»