条件付き繰り返し
三章ですでに繰り返しを扱いましたが、今回も扱います。ただし、条件付き。
そもそも、パソコンのように、根本的には単純なことしかできない機械では「何度も作業を繰り返す」ということは必要不可欠なのです。
さて、ここで「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 件のコメント:
コメントを投稿