階乗の計算、カードの並べ替え、ハノイの塔、 などは実は同じことの繰り返しである。 まずは階乗計算をプログラムにしたものを見てみよう。
「ある正の整数 n について、その階乗を求めよ。」という定義は、
である。これの意味するところは「n から順番に一つ小さい数を掛けていって、 1 になるまで求めよ」である。もちろん while -- end や for -- end を使ってもよいが、method を用いることもできる。 factorial.rb
#!/usr/koeki/bin/ruby
def factorial(m)
if m == 1
1
else
m * factorial(m-1)
end
end
n = 1
# n = 2
# n = 3
# n = gets.chomp.to_i
printf("%dの階乗は%dです\n", n, factorial(n))
n = 1 の場合は 1 である。n = 2 の場合と n = 3 の場合を入れて確かめてみよう。 def -- end の中で、n > 1 ならば、
n かける factorial(n-1)
を実行する。n - 1 = 1 (n = 2 のとき) なので、 factorial(1) = 1 が入る。よって答えは 2 * 1 = 2 を得る。
n = 3 の場合は、n - 1 = 2 (n = 3 のとき)なので、 factorial(2) をかければよい。factorial(2) は、前の結果を使って 2 なので、 3 * 2 = 6 を得る。以下同様。
n = 1 の場合を理解したら、n = 2, n = 3 ... と入れ換える。最後に、 n = 1 に # をつけて、残りの # を外して、 入力して答えが得られるようにせよ。