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
vはaだけが、wは順序を逆転させたものが表示される。
練習問題3.15
練習問題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