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)))