計算機プログラムの構造と解釈 第二版 P64 問題2.30

この問題、問題は単純だけど句読点の場所とかを意識しないと問題がうまく読めない。


求める答えは以下の2つでいいと思う。
・square-treeを直接に定義する。
・square-treeをmapと再帰を使って定義する。


何を僕がとち狂っているのかというと、
直接バージョンと、mapバージョンと、再起バージョンと三つ作るのかと思って焦ったんだけど
よくよんだら、二つだったと言うだけの話です。


さて、本の内容を参考にしながらやれば、決して難しい問題ではないとおもうので、
さっそく実装

#!/usr/local/bin/gosh
;; -*- coding: utf-8 -*-

(use ggc.debug.trace)
(use math.mt-random)

(define nil '())

(define mytree (list 1 (list 2 (list 3 4) 5) (list 6 7)))


(define (square-tree1 tree)
  (cond ((null? tree) nil)
        ((not (pair? tree)) (* tree tree))
        (else (cons (square-tree1 (car tree))
                    (square-tree1 (cdr tree))))))


(define (square-tree2 tree)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
           (square-tree2 sub-tree)
           (* sub-tree sub-tree)))
       tree))


;; main
(define (main args)

  (display "mytree: ")
  (display mytree)
  (newline)

  (display "(square-tree1 mytree): ")
  (display (square-tree1 mytree))
  (newline)


  (display "(square-tree2 mytree): ")
  (display (square-tree2 mytree))
  (newline)

  0)

mapをつかうととてもかっこいい。
実行

mytree: (1 (2 (3 4) 5) (6 7))
(square-tree1 mytree): (1 (4 (9 16) 25) (36 49))
(square-tree2 mytree): (1 (4 (9 16) 25) (36 49))


できているはず。