SICPゼミ第17回

練習問題3.12

1つめの (cdr x) は (b)
2つめの (cdr x) は (b c d)

1つめでは x が (a b) なので (b) が返る。
2つめでは x が append! にある set-cdr! のせいで (a b c d) になっているので (b c d) が返る。

by tube

練習問題3.13

a -> b -> c -> a ->.....
となっているので last-pair の (if (null? (cdr x))) が永遠に #t 評価に入らず無限に last-pair が呼び出される。

by tube

練習問題3.14

f:id:sicp-zemi:20160701165808j:plain

vはaだけが、wは順序を逆転させたものが表示される。

練習問題3.15

f:id:sicp-zemi:20160701171036j:plain

練習問題3.16
(define x (cons 1 2))
(define y (cons 3 4))
(define z (cons x y))

(define x (cons 1 2))
(define y (cons 3 4))
(set-car! x y)
(define z (cons x y))

(define x (cons 1 2))
(define y (cons 3 4))
(set-car! x y)
(set-cdr! x y)
(define z (cons x x))

順に(count-pairs z)が3,4,7

by dolicas

練習問題3.17
(define (count-pairs x)
  (define ll '())
  (define (search a l)
    (if (null? l)
        #f
        (if (eq? (car l) a)
            #t
            (search a (cdr l)))))
  (define (count-sub x l)
    (if (not (pair? x))
        0
        (if (search x l)
            0
            (begin (set! ll (cons x l))
                   (+ (count-sub (car x) ll)
                      (count-sub (cdr x) ll)
                      1)))))
  (count-sub x '()))

by tube

練習問題3.18
(define (check-cycle x)
  (define (check-cycle-loop x)
    (if (not (pair? x))
        #f
        (if (or (check-cycle-acc x (car x)) (check-cycle-acc x (cdr x)))
            #t
            (or (check-cycle-loop (cdr x)) (check-cycle-loop (cdr x))))))
  (define (check-cycle-acc start ls)
    (if (not (null? ls))
        (if (eq? start ls)
            #t
            (if (pair? ls)
                (or (check-cycle-acc start (cdr ls)) (check-cycle-acc start (cdr ls)))
                #f))
        #f))
  (check-cycle-loop x))

by pine

練習問題3.19
(define (search-loop l)
  (define nil '())
  (define (read-iter l i obj)
    (let ((ll (cdr l)))
      (cond
        ((eq? ll nil) 0)
        ((eq? obj ll) 1)
        ((= i 1) 2)
        (else (read-iter ll (- i 1) obj))
        )
      )
    )
  (define (search-loop-iter l i)
    (let ((flag (read-iter l i l)))
      (cond
        ((= flag 0) #f)
        ((= flag 1) #t)
        (else (search-loop-iter (cdr l) (+ i 1)))
        )
      )
    )
  (search-loop-iter l 1)
  )

by dolicas

練習問題3.20

f:id:sicp-zemi:20160706153027j:plain