階乗の計算をしようと思ったらなかったので作る。
def factorial(number)
if number.zero?
1
else
number * factorial(number - 1)
end
end
こんな感じで実装。
number
が大きい時にエラる。。。
pry(main)> a=Hoge.factorial(9000)
SystemStackError: stack level too deep
再帰の限界があるっぽい??
Railsのsum
のsourceを見てみたら、inject
を使ってた。
のでinject
を試してみる。
def factorial(number)
(1..number).inject(1,:*)
end
これだと、数値が大きくても行けるっぽい。
number
がnil
だとエラるのでnil
だと0
が入るようにする。
def factorial(number)
number = 0 if number.nil?
(1..number).inject(1,:*)
end
このままだと直感的に階乗てわかりづらい。
Integer
を拡張した方が便利そうなので拡張する。
class Integer
def factorial
(1..self).inject(1,:*)
end
end
nil
だからほにゃららってとこは要らんかった。
class Integer
alias :! :factorial
end
でより階乗っぽく書ける。
pry(main)> 5.!
=> 120
100,000
くらいになると遅いけどまぁいいや。