Hatena::Groupcsnagoya-sicp

クラなんとかの日記 このページをアンテナに追加 RSSフィード

 | 

2009-06-11準備会

2.35

| 2.35 - クラなんとかの日記 を含むブックマーク はてなブックマーク - 2.35 - クラなんとかの日記 2.35 - クラなんとかの日記 のブックマークコメント

count-leaves をaccumulate を使って実装する.

再帰がどこにかかるかわかれば簡単.

list の要素がlist である場合に再帰すればよい.

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

;; 準備
(define (accumulate op initial sequence)
  (if (null? sequence)
      initial
      (op (car sequence)
          (accumulate op initial (cdr sequence)))))

;; 答え
(define (count-leaves tree)
  (accumulate + 0 (map (lambda (x)
                         (if (pair? x)
                             (count-leaves x)
                             1))
                       tree)))
              

;; 確認
(define x (cons (list 1 2) (list 3 4)))
(define y (list x x))

(display x) (newline) ; ((1 2) 3 4)
(display y) (newline) ; (((1 2) 3 4) ((1 2) 3 4))
(display (length x)) (newline) ; 3
(display (length y)) (newline) ; 2
(display (count-leaves x)) (newline) ; 4
(display (count-leaves y)) (newline) ; 8
 |