おさかな日誌

魚類がプログラミング

rubyで階乗計算するプログラムを書いてみた

こちらのブログ記事を読んで勉強がてらrubyのコードを書いてみました。階乗計算をするプログラムでイテレータを使うという条件で書いてみました。

def factorial (n)
	(n - 1).downto(1) do |i|
		n *= i
	end
	return n
end

puts factorial(gets.chomp.to_i)


ついでに再帰的関数呼び出し(?)を使って書くとこんな感じです。

def factorial(n)
        if n == 0
                return 1
        end
        return n * factorial(n - 1)
end

puts factorial(gets.chomp.to_i)

再帰的呼び出しを使うと1000の階乗を計算しようとすると"stack level too deep"となって計算できないのですが、イテレータを使っている方は100,000の階乗も計算できて驚きました。ちなみに1分弱ほど時間がかかっていました。100,000!の計算結果は456,574桁もあるんですねぇ…


そうこうしている内にこちらの記事を見つけて読んでみると、オブジェクト指向的に書くということで組み込みクラスのNumericクラスにfactorial関数を足しています。初学者の僕は「組み込みクラスに自前の関数とか足していいのかな、オロロ…」となってしまいます。そのへんのところを分かるようになりたいですね。

しかし、ネット上でいろんなrubyの階乗計算コードを見てみるといろんな書き方があって楽しいですね。僕もなるべく綺麗というか美しいコードを書けるようになりたいです。