「アルゴリズム」のその前に
プログラミングを勉強しようと思ったら、まずは変数の定義の仕方や if 文・for 文の使い方などの基礎的な文法を学ぶでしょう。
では、基礎的な文法をマスターしたら次は何をするでしょうか? もちろん、何か具体的な目的を持っている人はそれに取り組んでいくとは思いますが、とりあえずプログラミングに触れてみたかった、という人は、アルゴリズムの勉強を始める場合が多いのではないでしょうか。
しかし、単に基礎的な文法を理解しただけの状態で、競技プログラミングなどのいわゆる「アルゴリズム」とされるものに挑むと、やや障壁を感じる部分があると感じます。
今回は、アルゴリズムとして紹介されることは少ないものの、文法の基礎を理解しただけだと迷ってしまいがちな「合計値」の求め方を扱います。
なお、本記事ではプログラムを Python で記述します。
合計値を求めるとはどういうことか
ある配列の要素の合計の値を求めるには、どうすればよいでしょうか。
例えば、次のような配列があるとします。この合計である 20
を画面に表示するにはどうしたらいいでしょうか。
numbers = [1, 4, 6, 4, 5]
では、私たち人間が計算しているやり方をプログラムに落とし込んでみましょう。
まあ、そんなものは としているだけだ、と思うかもしれません。
配列 numbers
の要素は numbers[0]
のようにして扱うことができますから、
print(numbers[0] + numbers[1] + numbers[2] + numbers[3] + numbers[4])
とすれば、確かに答えの 20
が表示されるでしょう。
しかし、お気づきの通り、これだと下のように、数の個数が違う場合に対応できませんね。
numbers = [4, 2, 5]
numbers = [3, 5, 4, 0, 5, 2, 3, 9]
数の個数、すなわち配列の要素の数がいくつであっても合計を計算できるようにするにはどうすればよいでしょうか?
ポイントは 「同じ操作の繰り返し」 です。合計の計算を、同じ操作の繰り返しによって計算できるようにしておけば、繰り返す「回数」を変えるだけでどんな個数にも対応できるからです。
同じ操作の繰り返しで合計を求める
我々が計算している という動作をもっと細かく考えてみましょう。
1 桁の数であれば、もしかしたら一目見ただけで足し算ができる人もいるかもしれません。しかし、次のような数であればどうでしょうか。
numbers = [153, 262, 134, 358, 211]
このような大きな数であれば、
- まず とし、
- 次に とし、
- 次に とし、
- 次に とする
というように順番に計算をするのではないでしょうか。
つまり、
- 最初の数に次の数を足す。
- 1 の結果に次の数を足す。
- 2 の結果に次の数を足す。
- 3 の結果に次の数を足す。
ということになります。
いったんこれをコードにしてみると、次のようになります。
numbers = [153, 262, 134, 358, 211]
result1 = numbers[0] + numbers[1]
result2 = result1 + numbers[2]
result3 = result2 + numbers[3]
result4 = result3 + numbers[4]
print(result4)
これでも正しい答えは得られますが、このコードからさらに無駄な部分を省き、繰り返しが可能な形にしていきましょう。
まず、result1
, result2
, result3
, result4
と 4 つも変数を使う必要があるでしょうか?
個々の足し算の結果を毎回違う変数に格納しなくとも、次のように同じ result
という変数に足していけば問題ありません。
result = numbers[0] + numbers[1]
result = result + numbers[2]
result = result + numbers[3]
result = result + numbers[4]
ここで、result = result + numbers[2]
のように両辺に同じ変数が登場すると戸惑う人もいるかもしれませんが、=
というのは等号ではなく、単に代入の記号であることを思い出しましょう。右辺の式を計算してから、その結果を左辺の変数に代入しているだけです。
そして、同じ変数に足していくだけということは、次のようにしても同じはずです。
result = numbers[0]
result = result + numbers[1]
result = result + numbers[2]
result = result + numbers[3]
result = result + numbers[4]
もっといえば、次のように書き換えられます。
result = 0
result = result + numbers[0]
result = result + numbers[1]
result = result + numbers[2]
result = result + numbers[3]
result = result + numbers[4]
こうすると、すべての足し算が、[]
の中の数字を除いて同じ操作になりました。
ここまできたら、for 文や while 文を使って繰り返しが実現できそうです。
while 文のほうが単純なので、まずは while 文でコードを書いてみましょう。
繰り返しの部分を while の中に入れてみます。
result = 0
while 条件:
result = result + numbers[i]
ここでは、[ ]
の中の数字を i
としておいています。この i
は、毎回 1 つずつ増えていく値なので、ループの中で毎回 1 を足してあげれば良さそうです。
result = 0
while 条件:
result = result + numbers[i]
i = i + 1
numbers[0]
が最初に出てくるので、i
の値は 0 から始めればよいですね。
result = 0
i = 0
while 条件:
result = result + numbers[i]
i = i + 1
ここで、ループを続ける 条件
の部分は何になるでしょうか?
合計を求めるということは、配列の要素が尽きるまで足し算を続ければよいということです。今回、配列の 0 番目・1 番目・2 番目・3 番目・4 番目の要素まで足せばよく、5 番目の要素はないので、ループを続ける条件は i < 5
とできそうです。
よって、次のようになります。これで、print(result)
とすれば正しい答えが表示されるはずです。
result = 0
i = 0
while i < 5:
result = result + numbers[i]
i = i + 1
以上のようにすることで、配列の要素の数がいくつであっても合計を計算できるようになりました。
最後に、同じコードを for 文でも書いてみましょう。
for 文は、while 文に機能を追加したものと捉えられます。今回のように、i
といった変数を増やしながら計算する、といった際に便利に使えます。
結論から言ってしまえば、次のようなコードになります。i
に関わる計算を勝手にやってくれているわけですね。
result = 0
for i in range(5):
result = result + numbers[i]
このように、繰り返しの操作をうまく活用すること、むしろ、どう繰り返しができる形に持っていくかがプログラムをうまく扱う 1 つのコツともいえるでしょう。