九九プログラムいろいろ(再帰の別解)
2007/05/12
九九プログラムいろいろ(id:ibaza:20070512:1178898235 さんのとこより。)
id:ytakenakaさんがコメント欄で2重再帰の方法を書かれていました。再帰は再帰でもいろいろあるんですね。別の再帰のアプローチでやってみました。練習を兼ねて1から作りました。
;かけ算結果表示 (defun by-result (x y) (format t " ~2d" (* x y))) ;1段分表示 (defun print-dan (x y) (if (= x 10) nil (progn (by-result x y) (print-dan (1+ x) y)))) ;複数段表示 (defun print-dans (y) (if (= y 10) nil (progn (print-dan 1 y) (terpri) (print-dans (1+ y))))) ;九九表示 (print-dans 1)
これだと10がハードコードされている点が気に入らない。
ついでに、インド人もびっくりの19×19まで対応させてみる。
(defun kuku (&optional (len 9)) (labels ((by-result (x y) (format t " ~3d" (* x y))) (print-dan (x y) (if (> x len) nil (progn (by-result x y) (print-dan (1+ x) y)))) (print-dans (y) (if (> y len) nil (progn (print-dan 1 y) (terpri) (print-dans (1+ y)))))) (print-dans 1))) (kuku)
labelsを使って各関数(by-result、print-dan、print-dans)をローカル化しました。
名前の競合が起こる程大きなプログラム作ってないですが、labelsを使った方が関数のスコープが狭くなって嬉しいはず。あと、省略可能な引数というのを使ってみました。
(kuku 19)
既に九九じゃないw
#なんか最近、lispの魅力がわかってきた気がする。