sicp(11)m2.25〜m2.27
2.28は解けませんでした><(明日やる)
;;復習。 (define (map lst f) (if (null? (cdr lst)) (cons (f (car lst)) '()) (cons (f (car lst)) (map (cdr lst) f)))) (define (square-list lst) (map lst (lambda (x) (* x x)))) ;;あー、わざわざnull?の部分cdrを使う必要なかった。 (define (map lst f) (if (null? lst) '() (cons (f (car lst)) (map (cdr lst) f)))) (define (count-leaves x) (cond ((null? x) 0) ((not (pair? x)) 1) (else (+ (count-leaves (car x)) (count-leaves (cdr x)))))) ;;m2.25 ;;解く前に名前を付けておく。 (define m2.25a '(1 3 (5 7) 9)) ;!gosh> (car (cdr (car (cdr (cdr m2.25a))))) ;!7 (define m2.25b '((7))) ;!gosh> (car (car m2.25b )) ;!7 (define m2.25c '(1 (2 (3 (4 (5 (6 7))))))) ;!gosh> (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr (car (cdr m2.25c)))))))))))) ;!7 ;;m2.27 (define x (list (list 1 2) (list 3 4))) ;;とりあえず、reverseを作ってから考えてみる。 (define (reverse lst) (define (iter lst result) (if (null? lst) result (iter (cdr lst) (cons (car lst) result)))) (iter lst '())) (define (deep-reverse lst) (if (pair? lst) (cons (deep-reverse (car (cdr lst))) (cons (deep-reverse (car lst)) '())) lst)) ;;置き換えで考えてみた。(d=deep-reverse) ;;(d ((1 2) (3 4))) ;;((d (3 4)) (d(1 2))) ;;(((d 4)(d 3)) ((d 2) (d 1))) ;;((4 3) (2 1)) ;;できた。 ;!gosh> (deep-reverse hoge) ;!(((4 3) 2) 1) ;!gosh> hoge ;!(1 (2 (3 4))) ;!gosh> x ;!((1 2) (3 4)) ;!gosh> (deep-reverse x) ;!((4 3) (2 1)) ;;m2.28 ;;上手く動きません。失敗です。>< ;;m2.27のxを使う。 ;(define (fringe lst) ; (define (f ls) ; (if (pair? (car ls)) ; (if (null? (cdr ls)) ; (f (car (cdr ls))) ; (cons (f (car ls)) (f (car (cdr ls))))) ; ls)) ; (f (car lst)))