解説 4月26日B

今回の学習項目です。


復習:振り返り

4月中はRubyのプログラミングについて、やや駆け足的に復習してきました。 今日は、今までの資料を振り返って、復習してきたことの整理をしてみましょう。 そして、連休明けの講義へとつなげていくことにしましょう。

大事なこと...次回からは(なんと!)教科書を使います。 必ず教科書を持ってきてください。持っていない人は連休中に用意しておいてください。


課題1-1 ユークリッドの互除法

次はa, bを正整数としたときに、aとbの最大公約数を求める手続きである。 これをもとに関数 gcd(a,b) を作り、a=72, b=30 として正しく答えが求まることを確認せよ。

  1. b > a ならば bとaの値を取り替える(swapする)
  2. aのbによる剰余をcとする (式で書けば c = a % b)
  3. c = 0 ならば bを返して終了
    さもなくば、a = b, b = cとして1へ。

[最大公約数]
整数aとbの最大公約数とは、中学の数学での用語で、 『公約数のうち最大の数」を意味します。
ここで「aとbの公約数」とは、 「aの約数とbの約数のうち、共通な数」のことです。
なお、「aの約数」とは、その数でaが割り切れる数のことです。 例えば、30の約数は 1, 2, 3, 5, 6, 10, 15, 30 です。 また、72の約数は 1, 2, 3, 4, 6, 8, 9, 12, 18, 24, 36, 72 です。
ですから、30と72の公約数は、30の約数と72の約数のうち共通な数ですから、1,2,3,6 です。 このことから、30と72の最大公約数は6ということになります。

[swap]

変数aとbの値の取り替え(swap)は、いろいろな場所で使われます。 具体的にはa=10, b=5 とするとswapした結果は、a=5, b=10となればよいのですが、 aにもbにもどのような値が入っていてもこういう取り換えができる、 ということが重要です。

以下のようにやればできるように思うかもしれません:

 a = b
 b = a
しかし、これではダメです。a=bとした時には、aのもとの値が消えてしまい、 aにはbの値(a=10, b=5だったとすれば 5)が入ってしまいます。 だから、この2つの命令を実行した結果は a = b = 5 となります。

普通のやり方は、もう一つ変数を用意する、というものです。 その変数に「もとのaの値を記憶」させておきます。 つまり次のようにやればよいのです。

 c = a   # aの値を記憶
 a = b
 b = c  # bに元のaの値を代入

これが普通のプログラミング言語のやり方ですが、Rubyには次のような方法があります (これを多重代入(並行代入)といいます):

 a, b = b, a
ぜひこれを試して、ちゃんとaとbの値が入れ替わることを確かめてください。

課題1-2 += 代入文

Rubyではプログラミング言語Cのように、以下のような代入文を書くことができる:

x = 10
x += 20
p x
これを実行して変数xの値を確かめなさい。

課題1-3 いろいろな代入文

実は、課題1-2の x += y という形の代入文は、x = x+y を省略した形の代入文であった。
加算(+)以外の算術演算子、すなわち、掛け算(*)、割り算(/)、引き算(-)、剰余(%)、乗数(**)でもこのような代入文がかけるかどうか、確かめなさい。


「アルゴリズムとデータ構造」のホームに戻る