さかもとのブログ

つらつらと

SICP演習問題2.27~2.32

;;2.27
(define (deep-reverse lis)
  (if (pair? lis)
      (append (deep-reverse (cdr lis)) (list (deep-reverse (car lis))))
      lis))

higeponさんがとってきた解答例では

(define (deep-reverse tree)
  (if (not (pair? tree))
      tree
      (reverse (map deep-reverse tree))))

お,おされだ..

;;2.28
(define (fringe lis)
  (cond [(null? lis) '()]
        [(pair? (car lis))
         (append (fringe (car lis)) (fringe (cdr lis)))]
        [else (append (list (car lis)) (fringe (cdr lis)))]))

一応できだんだけど,これもmapをつかってなんとかできないかぁ..

;;2.30                                                                                                                                
(define (square x) (* x x))
(define (square-tree tree)
  (cond [(null? tree) '()]
        [(not (pair? tree)) (square tree)]
        [else
         (cons (square-tree (car tree))
               (square-tree (cdr tree)))]))
(define (square-tree tree)
  (map (lambda (sub-tree)                                                                                                                      
         (if (pair? sub-tree)                                                                                                                  
             (square-tree sub-tree)                                                                                                            
             (square sub-tree)))
       tree))
;;2.31
(define (tree-map proc tree)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
             (tree-map proc sub-tree)
             (proc sub-tree)))
       tree))