next up previous
Next: 10.5 探索木表現のデータ変換 Up: 10 探索木 Previous: 10.3 親子関係を表す木表現の生成

10.4 探索木表現のコンスセルを数える

ここでちょっと基本的なプログラム作りの復習です. 上のような2つの探索木表現のデータのサイズを比較するために, コンスセルの数を数えるcell-countを定義してみましょう. コンスセルはリストを構成する最小ユニットで,アトムでないデータです. アトムとみなされるデータは以下のようにたくさんあります. 配列,構造体,文字列,文字,数,シンボルなどすべてアトムです.
<cl> (atom "abc")
T 
<cl> (atom (make-array '(2 3)))
T 
<cl> (atom #\a)
T 
<cl> (defstruct test a b)
TEST 
<cl> (atom (make-test :a 1 :b 2))
T 
<cl> (atom 'abc)
T 
<cl> (atom 10)
T 
<cl> (atom 1.1)
T 
<cl> (atom '(a))
NIL 
<cl> (atom nil)
T 
<cl> (atom '())
T
注意しなければならないのは,nilもアトムということです. Lispでは,nilはアトムでもあり長さ0のリストでもあります. コンスセルを数えるには,リストをたどってゆきアトムでない要素が きたらば,それはコンスであるからそのコンスのcar部とcdr部の セルを数えた数に1を加えるということで再帰的に定義可能です.

(defun cell-count (tree)
  (cond
   ((atom tree) 0)
   (t (+ 1
         (cell-count (car tree))
         (cell-count (cdr tree))))))
簡単な構造のリストに適用すると,
<cl> (cell-count '(a b c))
3 
<cl> (cell-count nil)
0 
<cl> (cell-count '(a))
1 
<cl> (cell-count '((a)))
2
となります.グラフと探索木に対して適用してみます.
<cl> (cell-count (graph-tree *graph1* 's))
45 
<cl> (cell-count (find-all-paths *graph1* 's))
60 
<cl> (cell-count *graph1*)
26 
<cl> (cell-count *graph2*)
31
となって,パスのリストで表現する*tree1*の方が*tree2*よりも冗長な分 よけいにセルが必要であることがわかります.

generated through LaTeX2HTML. M.Inaba 平成18年5月6日