皆さんは,アルゴリズムをどのようにして設計しているだろうか。先人たちが生み出した有名なアルゴリズムをそのまま使うのも1つの手だ。しかし,より上位のITエンジニアを目指すならば,多くのアルゴリズムのベースとなる「設計技法」を理解し,新たなアルゴリズム設計に挑戦してほしい。

 何らかのプログラミング経験がある方ならば,二分探索法やクイックソートなど,先人たちが考案した有名なアルゴリズムをご存知だろう。このようなアルゴリズムを思い付くのは,天才的な学者たちだけかもしれない。しかし,個々のアルゴリズムを分類してみると,いくつかの共通的な「設計技法」をベースにしていることが分かる。

 今回は,ITエンジニアとして知っておくべきアルゴリズムの主要な設計技法を3つほど紹介しよう。なお,サンプルプログラムはVBScript(Visual Basic Scripting Edition)で記述している。テキストエディタで記述し,拡張子「.vbs」で保存すれば,Windows環境で実行できる。ぜひ実際に試してほしい。

For~Nextは設計技法ではない

 個々の設計技法の説明に入る前に,アルゴリズムの基本用語について触れておきたい。

 多くのプログラミング言語の文法では,演算処理のまとまりを「関数(メソッドやプロシージャとも呼ぶ)」として表現する。プログラムの関数は,数学の関数である「y=(x)」と同様に,カッコ内に与えられたデータを入力値として受け取り,何らかの演算処理を行ったうえで,結果の値を出力する。その際,関数に入力するデータを「引数(ひきすう)」,結果の値を出力することを「戻り値を返す」と呼ぶ。また,関数を使うことを「関数の呼び出し(コール)」と呼ぶことはご存知の通りだ。

 関数にはその機能を表す任意の名前(関数名)を付ける。例えば,ある数値(引数)の階乗を戻り値として返す「Kaijo」という名前の関数があるなら,次のようにして5の階乗の演算結果を変数「y」に代入できる。

y = Kaijo(5)

 この「y = Kaijo(5)」の結果を求めるための演算手順が「アルゴリズム」である。実際に階乗を求めるアルゴリズムはどのように設計すればよいのか。

 1つのやり方として「引数xに与えられた値から1までの整数を順番に繰り返し乗算していく方法」が考えられる。この場合のKaijo関数の処理内容は,図1のように定義できる。

図1●階乗を求める特に工夫のないプログラム
図1●階乗を求める特に工夫のないプログラム
For~Next文を使ってXの値を変えながら乗算を繰り返すアルゴリズム。特定の設計技法には分類されない最もシンプルなアルゴリズムである

 For~Next文の部分で引数の値を変更して繰り返し乗算を行っている。これは階乗を求めるための最もシンプル(もしくは原始的)なプログラムであり,設計技法としての名前は特に付けられていない。

関数から関数を呼び出す

 もう1つ別のやり方として,「xと(x-1)の階乗を乗算する方法」が考えられる。5の階乗は「5×(4の階乗)」,つまり「5×(5-1の階乗)」と同じである。この場合のKaijo関数の処理内容は,図2のように定義できる。図2のプログラムには,階乗を求める数値の設定と結果の表示を行う機能も付加しているので,実行して結果を確認できる。プログラムの実行結果を図3に示した。

図2●アルゴリズムの設計技法「再帰呼び出し」を使って階乗を求めるプログラム
図2●アルゴリズムの設計技法「再帰呼び出し」を使って階乗を求めるプログラム
階乗を求めるKaijo関数の中でKaijo関数を呼び出すアルゴリズム。Xが0になった時点で演算結果を返す
[画像のクリックで拡大表示]

図3●図2のプログラムの実行結果
図3●図2のプログラムの実行結果
階乗を求める値を入力して「OK」ボタンをクリックすると,右のように演算結果が表示される
[画像のクリックで拡大表示]

 さて,ここからがポイントだ。図2のKaijo(x)の処理の中で,「ans = x * Kaijo(x-1)」という部分に注目してほしい。Kaijo関数の処理の中で,同じKaijo関数を呼び出しているのだ。このように,関数の処理の中で同じ関数を呼び出すアルゴリズムの技法を「再帰呼び出し(Recursive Call)」と呼ぶ。同じ関数の呼び出しに再び帰るという意味である。