sicp(12)m2.28

(実際にupしたのは6日です)
やっと解けた。
cdrでリストを下っていくものの応用でできた。
(2つの関数どうしが互いに呼ばれ合うようなものの作り方に悩んでいたのかもしれない)

;;復習。
;;reverse と deep-reverse を作る。
(define (reverse lst)
  (define (iter result lst)
    (if (null? lst)
        result
        (iter (cons (car lst) result) (cdr lst))))
  (iter '() lst))
;	gosh> (reverse '( 1 2 3 4))
;	(4 3 2 1)
(define (deep-reverse lst)
  (if (pair? lst)
      (cons (deep-reverse (car (cdr lst)))
            (cons (deep-reverse (car lst)) '()))
      lst))
;	gosh> (deep-reverse '((1 2) (3 4)))
;	((4 3) (2 1))
;;これぐらいなら、全く迷いなく作れるみたい。

;;さてさて、前回解けなかったm2.28
;;==ここからは試行錯誤の過程==
;;(define x (list (list 1 2) (list 3 4)))
;;ー関数fだけで頑張ろうとしたら無限ループに陥ったー
;;(define (fring lst)
;;  (define (f items)
;;    (let ((ls (car items))
;;          (rs (cdr items)))
;;    (if (pair? ls)
;;        (f ls)
;;        (if (not (null? rs))
;;            (cons ls (f rs))
;;            (if (not (null? (cdr lst)))
;;                (cons ls (f (cdr lst)))
;;                (cons ls '()))))))
;;  (f lst))
;;((lambda (x) (cons (car x) (cons (car (cdr x)) '()))) '(1 2))
;;=>(1 2)
;;ー左右一気に見れるかもしれないと思ったが整合性がつかなかったー
;;(define (fring lst)
;;  (let ((ls (car lst))
;;        (rs (cdr lst)))
;;    (if (pair? lst)
;;        (if (null? rs)
;;            ls
;;            (cons (fringe ls) (cons (fringe rs) '()))
;;        ls))))
;;===========

(define (fringe lst)
  (define (c-f items)
    (if (pair? items)
        (let ((ls (car items))
              (rs (cdr items)))
          (if (pair? ls)
              (c-f ls)
              (if (pair? rs)
                  (cons ls (c-f rs))
                  (cons ls (fringe (cdr lst))))))
        (cons items (fringe (cdr lst)))))
(if (null? lst)
      '()
      (c-f (car lst))))
;;できた!
;	gosh> (fringe x)
;	(1 2 3 4)
;	gosh> (fringe '(1 (2 (3 (4 5)))))
;	(1 2 3 4 5)

;;m2.29
(define (make-mobile left right)
  (list left right))
(define (make-branch length structure)
  (list length structure))

;a.
(define (left-branch mobile)
  (car mobile))
(define (right-branch mobile)
  (car (cdr mobile)))
(define (branch-length branch)
  (car branch))
(define (branch-structure branch)
  (car (cdr branch)))

;b.
(define (total-weight mobile)
  (let ((lb (left-branch mobile))
       (rb (right-branch mobile)))
    (+ (branch-weight lb)
       (branch-weight rb))))

(define (branch-weight branch)
  (let ((st (branch-structure branch)))
    (if (pair? branch)
        (total-weight st)
        st)))

;c
;(define (balanced-mobile? mobile)
;  (define (scale branch)
;    (* (branch-weight branch)
;       (branch-length branch)))
;  (let ((lb (left-branch mobile))
;        (rb (right-branch mobile)))
;    (if (and (= (scale lb) (scale rb))
;            ))))
;
;;よくわからなくなったので、他のことをする。
;;(ここら辺でしばらく立往生かも><)

;;same-parityをもっと簡易に書く。
(define (same-parity x . y)
  (define (push? n)
    (= (remainder (- n x) 2) 0))
  (define (f items)
      (if (null? items)
          '()
          (if (push? (car items))
              (cons (car items) (f (cdr items)))
              (f (cdr items)))))
  (cons x (f y)))
;	gosh> (same-parity 1 2 3 4 5 6 7)
;	(1 3 5 7)

|