階乗の計算をしようと思ったらなかったので作る。
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くらいになると遅いけどまぁいいや。