プログラマの仕事はツールを使うことじゃない,
プログラミングの本当の楽しさを味わおう

講師 矢沢 久雄

鶴亀算からアルゴリズムである条件を探る

図2●小学生が鶴亀算を解くアルゴリズム
問題を解く手順が明確になっていれば,プログラムに置き換えてコンピュータで問題を解くことができる
 そもそもアルゴリズムとは何かを考えてみよう。JISではアルゴリズムを「明確に定義された有限個の規則の集まりであって,有限回適用することにより問題を解くもの。例えば,sin xを決められた精度で求める算術的な手順をもれなく記述した文」と定義している。

 これを簡単に言えば,「与えられた問題を解くための手順」がアルゴリズムということになる。それでは,ウォーミング・アップとして以下の問題を解く手順,すなわちアルゴリズムを考えてみてほしい。難しい問題ではない。小学校で習う「鶴亀算」である。

【問題1】鶴と亀が合わせて16匹いる。足の数の合計は全部で44本である。鶴と亀はそれぞれ何匹ずついるか?

 1羽の鶴の足の数は2本で,1匹の亀の足の数は4本であるところが,この問題を解くポイントである。皆さんの頭の中には,この問題を解く方法として「連立方程式」という言葉が真っ先に思い付いたことだろう。鶴の数をx羽,亀の数をy匹としてこのような連立方程式を立てる。

図3●鶴亀算を解くプログラム
 これを解けば「鶴は10羽,亀は6匹」という正しい答えが得られる。

 それでは,この連立方程式をプログラム・コードに置き換えて,コンピュータで問題を解けるだろうか? このままでは,できないはずである。

 なぜなら,問題を解く手順,すなわちアルゴリズムが明確になっていないからである。連立方程式を使って鶴亀算を解くなら,(1)その連立方程式を立てるアルゴリズムと,(2)それを解くアルゴリズム──の両方が必要となる。この2つがすべて明確な手順として把握できなければ,決してプログラムを作成することはできない。

 すなわちアルゴリズムであることの必要条件は,「手順が明確であること」である。手順が明確であるとは,皆さんの頭の中ではなく,紙の上に手順を書き表せるということだ。そして,その手順を特定のプログラミング言語に置き換えれば,コンピュータで問題を解くことができる。

 連立方程式を立てるアルゴリズムと,それを解くアルゴリズム*3を考える前に,そもそも連立方程式を使うべきだったかどうかを考え直してみよう。鶴亀算は小学校の問題なので,中学校のアルゴリズムである連立方程式を使わなくても解けるはずである。小学校では以下のようにして,鶴亀算の解き方を教えている(図2[拡大表示])。

【鶴亀算の解法】
手順1:亀の前足を甲羅の中に引っ込める。これによって,鶴も亀も2本足の動物となる。
手順2:鶴と亀が合わせて16匹いるのだから,
手順1の状態における足の数の合計は16匹×2本=32本となる。
手順3:足の数の合計は実際には44本であるから,
44本-32本=12本は甲羅の中に引っ込めた亀の前足の合計である。
手順4:1匹の亀の前足は2本なので,亀は12本÷2本=6匹となる。
手順5:鶴と亀が合わせて16匹いるのだから,鶴は16匹-6匹=10羽となる。

写真3●図3の実行結果
 このアルゴリズムは,問題を解く手順を明確に表している。この手順の通りにやれば,どんな人でも,たとえそれがコンピュータであっても,問題を解くことができるはずである。もしできなければ,手順の伝え方が悪いか,アルゴリズムが間違っているかのいずれかである。

 アルゴリズムが正しい場合,そのアルゴリズムが明確になっていて,プログラミング言語の知識があれば,プログラム・コードへの置き換えで悩むことはない(図3[拡大表示])。もちろん,実行すれば答えが出る(写真3)。