PR

 今回は,皆さんに,プログラミングの楽しさを実感していただけるとっておきのネタを提供しましょう。これは,プログラミングを始めた人なら誰もが一度はハマってしまう魅力あふれるテクニックで,「再帰(recursive call)」と呼ばれます。

 いくつか実験プログラムを作って再帰の魅力を感じてもらいます。プログラミング未経験者であっても心配無用です。使用するVBScript(Visual Basic Scripting Edition)というプログラミング言語は,直感的にわかりやすいものだからです。Windowsさえあれば,ほかに何も準備はいりません。それでは,やってみよう!

まずはウォーミングアップ

 Windowsは,VBScriptで記述されたプログラムを,そのまま解釈・実行できます。Windowsに標準添付されたメモ帳(Notepad.exe)などを使って,プログラムを記述し,Sample1.vbsのように拡張子を.vbsとしたテキストファイルで保存すれば,それをダブルクリックするだけで実行できるのです。

 ウォーミングアップとして,キー入力された数値の階乗を求めるプログラムを作ってみましょう。階乗は,ある数から1までの整数をすべて掛け合わせた値です。例えば3の階乗は3×2×1で6です。数学では,ビックリマーク(!)で階乗を表します。例えば,

5!=5×4×3×2×1=120

です。これから,この階乗を計算するプログラムを作ります。退屈と思われるかもしれませんが,これから先の説明に重要な役割を果たすので,お許しください。

 メモ帳を起動したら,図1に示したプログラムを記述してください。プログラムの内容は,英語と数学(関数,変数,数式)をごちゃ混ぜにしたようなものです。でも難しい単語や式は登場しません。ポイントを説明しますので,プログラムの解読にチャンレンジしてください。InputBox関数は,キー入力用の小さなウィンドウを開きます。キー入力された数値は,変数aに代入されます。変数ansは,階乗の計算結果を入れるものです。最初に1を代入しておきます。

図1●階乗を求めるプログラム
図1●階乗を求めるプログラム

 For … Nextの部分は,繰り返し処理を意味します。For i = a To 1 Step -1は,変数iの値をaから1まで1ずつ減らしながら(例えば,変数aに5が入っているならiの値を5,4,3,2,1と変化させながら)繰り返せという意味です。

 繰り返されるのは,ans = ans * iという処理です。これによって,ansに5~1までのすべての整数を掛け合わせた値,すなわち階乗が求められます。最後のMsgBox関数は,メッセージを表示する小さなウィンドウを開きます。そこにansの値を表示させます。いかがですか? VBScriptは,とっても簡単でしょう!

 このプログラムをSample1.vbsというファイル名で,Windowsのデスクトップに保存することにしましょう。「名前を付けて保存する」ウィンドウで,「ファイル名」欄にSample.vbsと入力します。この際に「ファイルの種類」欄を「すべてのファイル」とすることに注意してください。メモ帳は,デフォルトでファイル名の拡張子を.txtにしてしまうからです。「すべてのファイル」にしておけば大丈夫です。よく確認してから[保存]ボタンを押してくださいね(図2)。

図2●拡張子を.vbsにしてファイルを保存する
図2●拡張子を.vbsにしてファイルを保存する
[画像のクリックで拡大表示]

 もしも,この記事を読みながら「生まれて初めてプログラムを作った」という人がいたら,いよいよ感動の瞬間です。あなたが作った最初のプログラムの実行です。デスクトップにあるSample1.vbsのアイコンをダブルクリックしてください。最初に表示された小さなウィンドウで「5」と入力してみましょう。別の小さなウィンドウに,5の階乗である120が表示されれば成功です(図3)。

図3●プログラムの実行結果
図3●プログラムの実行結果

 プログラムの実行結果を見て「うれしい!」と感じたなら,あなたにはプログラミングにハマる素質があります。筆者は,こんなシンプルなプログラムであっても,自分の思い通りに動作することが嬉しくて仕方がありません。この「自分の思い通りに動作する」ということが,プログラミングの楽しさなのだと思います。この先で紹介する再帰では,それをタップリ味わっていただけます。

再帰の説明の定番といったら,これ!

 それでは,いよいよ再帰をやってみましょう。プログラムにおける再帰とは,ある関数の処理の中で同じ関数を呼び出す(関数を使う)ことです。再帰によって,繰り返し処理をスマートに記述できます。ここで,スマートとは「賢い!」「短くてシンプル!」「カッコイイ!」という意味です。

 多くのプログラミング解説書では,階乗を題材にして再帰の説明をしています。筆者が,学生時代に先輩から再帰を教わったときも,やはり階乗が題材でした。ここでも,階乗を題材にして再帰を説明することにします。

 引数(関数のカッコの中に指定する値のこと)の階乗を求めるKaijo関数を作るとしたら,どのような処理になると思いますか? 先ほど説明したFor … Nextを使って繰り返し掛け算を行うのも一つの手段ですが,再帰を使ったほうがスマートになります。図4は,再帰を使ってKaijo関数を記述したものです。先ほどのプログラムを書き換え,Sample2.vbsというファイル名で保存しました。VBScriptでは,Function … End Functionで囲んで関数を記述します。

図4●これが再帰だ! カッコイイだろう!
図4●これが再帰だ! カッコイイだろう!

 Kaijo関数の処理内容は,引数aの階乗を計算するものです。If … Else ~ End Ifは,「もしもIf以降の条件がYESなら … を,そうでないなら ~ を実行せよ」という意味です。If a = 0 Then以下のKaijo = 1は「引数aが0なら答えは1」という意味です。数学では,0の階乗を1とする決まりだからです。

 さて,注目してほしいのは,Else以下の部分です。これが,再帰の極意です。

Kaijo = a * Kaijo(a - 1)

は「aの階乗は,aに,a-1の階乗をかけたものである」という意味です。例えば,aが5なら,「5の階乗は,5に4の階乗をかけたものだ」とプログラムに記述しているのです。なんと荒っぽいというか,おおらかというか。確かにその通りですが,こんなプログラムでちゃんと動作するのでしょうか? 大丈夫です。ちゃんと動作します。

 これが,再帰と呼ばれるテクニックです。Kaijo関数の処理の中でKaijo関数を呼んでいるのです。つまり,一つの処理を定義するのに,その処理自体を使っているのです。そんなプログラムでも,「自分の思い」通りに動作してくれます。実行結果は,ちゃんと最初に作ったプログラムと同じになります。