LoginSignup
15
12

More than 5 years have passed since last update.

[ruby][メモ] 階乗

Last updated at Posted at 2015-10-12

階乗の計算をしようと思ったらなかったので作る。

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

これだと、数値が大きくても行けるっぽい。

numbernilだとエラるので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くらいになると遅いけどまぁいいや。

15
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
12