九九プログラムいろいろ(再帰の別解)

九九プログラムいろいろ(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の魅力がわかってきた気がする。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください