日曜プログラミング

休日趣味でやってるプログラミング関連記事をダラダラと

p.142 での pow

p.142 で出てくる再帰版の pow だけど、機能を実現するだけならこうも書けるよな

(defn pow [base exp]
  (reduce * (repeat exp base)))

短いコードは正義。

ちなみにでっかい数を渡した時の結果について。

user> (pow 2 10000)
ArithmeticException integer overflow  clojure.lang.Numbers.throwIntOverflow (Numbers.java:1388)

The Joy of Clojure では例外発生しない結果になってるが、いつからか良く分からんけど
少なくとも Clojure 1.5.1 では上のように例外発生する。そういや数値型を良きに計らう機能は止めたとかどっかで見た気もするが忘れた。

これは末尾再帰版だろうが reduce 版だろうが同じ結果で回避するなら

user> (pow 2M 10000)
;=> エライ大きい数

と最初から BigDecimal で渡してやる。