二進木を平坦化するプログラムを関数プログラムしなさい。(Lispで実装しなさい。)
ソースコード
(defun flatten (x) (cond ((null x) nil) ((atom x) (list x)) (t (append (flatten (car x)) (flatten (cdr x))) ) ) ) (clear) (flatten '(1 (2 (3 4) (5) (6 7) 8) 9)) (flatten '(a (b (c (d e))) f (g h) i)) (flatten '((1 . 2) ((3 4) . 5) 6)) (flatten '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q))))
実行結果
t > (flatten '(1 (2 (3 4) (5) (6 7) 8) 9)) (1 2 3 4 5 6 7 8 9) > (flatten '(a (b (c (d e))) f (g h) i)) (a b c d e f g h i) > (flatten '((1 . 2) ((3 4) . 5) 6)) (1 2 3 4 5 6) > (flatten '(((k (r s t u)) g (m)) c d ((n) (o (v w x y z) q)))) (k r s t u g m c d n o v w x y z q)
その他、感想
Lisp 〜関数プログラミング〜
関数プログラミングによって、並行または並列プログラミングによっておこるクリティカルセクションでの操作を防げて、束縛がないことで一時的に変数を格納することなく、コードが統一しやすい(たぶん)。という点で優れていると思います。ただ、数学的体系に関係しているというのが書かれていてもどういった点で数学的に優れているのかまだピンと来ないので、Lispをもうちょっとやろうと思います。
Lispに関して 〜まつもとゆきひろ〜
今日京都コンピュータ学院50周年記念イベントでRubyの創設者「まつもとゆきひろ」さんの話を聞いてました。その中で、Lispというのは古いプログラミング言語と言われるけれども、数学的な考え方でプログラムされている以上、昔からの数学の積み重ねが言語に導入されているので、最先端のものだと考えた方が良いといっておられました。すなわち、言語の枠が狭いというのは時代に乗り遅れることだと思いました。もっと言語の概念、敬意を知って、時代に乗り遅れないように頑張ります。