『情報科学入門 Rubyを使って学ぶ』の練習問題の解答例の他、授業スライドの練習問題の解答例や、プログラミングのポイント等を掲載します。他クラスの方の利用歓迎。改良・訂正箇所ありましたらご指摘ください。

2011/01/28

[基]繰り返しのある関数(第四章)

条件付き繰り返し
三章ですでに繰り返しを扱いましたが、今回も扱います。ただし、条件付き。
そもそも、パソコンのように、根本的には単純なことしかできない機械では「何度も作業を繰り返す」ということは必要不可欠なのです。


さて、ここで「1からnまでの数のうちkの約数の最大を求める」ことを考えましょう。
まあ言い換えれば「nとkの最大公約数を求める」ってことですが、こう考えるとよりややこしくなるのでスルーで。


ではどうプログラムするか考えましょう。
n,n-1,n-2...と順番に、kの約数になるかどうか確かめていけばいいですね。そして、最初に割れた数を答えとすればいい。
でも、for in〜による繰り返しでは、割り切れる数を見つけた時点でストップすることができません。必要なのは、kの約数が見つかるまで、繰り返す関数です。
そこで使うのがwhile文。実際にかいてみましょう。


def  gd_loop(k,n)  ←関数名をgd_loopとする
  while  k%n != 0      ←「kをnで割ったあまりが0でない」とき
    n = n-1                  ←nを1小さくする
  end                        ←繰り返し命令終了
  n                           ←最終的なn(=kの約数)を出力
end                         ←関数定義終了


while - endは、「kをnで割ったあまりが0でない」限り繰り返されます。すなわち、「kをnで割ったあまりが0」になったら繰り返しが終了し、そのnを出力することになります。




再帰
これも繰り返しの一種です。ただし、少し毛色が違い、また使えるようになるまで少し慣れが必要です。
数学Bの数列でやった漸化式を覚えていますか。あのときは漸化式から数列を求めましたが、今回は、漸化式を作ってそれをそのままプログラムにしてしまおう、というものです。


三章で「1からnの和を求める」関数sum(n)をつくりました。これです。
def  sum(n)
  sum = 0
  for  i  in  1..n
    sum = sum + i
  end
  sum
end


さて、ここで同じ「1からnの和を求める」を漸化式にしてみましょう。簡単ですね。
sum(1)=1 ,  sum(n)=sum(n-1)+n (n=2,3,4...)
です。これがそのまま関数として定義できちゃいます。


def  sum(n)
  if  n>=2                ←「nが2以上」のとき
    sum(n-1) + n     ←「sum(n-1)+n」を出力
  else                      ←「nが2以上でない」すなわち「n=1」のとき
    1                        ←1を出力
  end                       ←条件分岐終了
end

0 件のコメント:

コメントを投稿