■ Tips [Delphi] 3-1
 Delphi - Delphiでちょっと使える子ネタ集
 第3回 「再帰対応関数とファイル列挙」

 こんにちは、Delphi6が出荷されましたね。どうもPersonal-Editionは近いうちには無料配布されるようです。開発環境のフリー化がどんどん進んでいる中でBorlandも頑張ってくれていて嬉しい限りです。Delphi6はLinux版Delphiという位置づけのKylixとの連携が強く意識されているそうなので、Java並のクロスプラットフォームが実現されるかもしれませんね。

 さて今回は「再帰対応関数とファイル列挙」という話題です。よく考えてみると列挙物のTipsばかりなような気がします。(^_^;今回は個人で使おうと思っているファイルリストメーカーを作るときに使った関数群です。だいぶ前(1年半くらい)にもリスト作成ソフトを作ろうとしたんですが、どうもうまく行かず投げ出した記憶があります。(T-T

 3-1 再帰対応関数その1

 関数について考えると、普通1回呼び出して終了する物が多いかと思います。前のウィンドウ列挙の時は子ウィンドウ列挙を親ウィンドウ列挙の中で実行しましたが、あれは中の処理は同じ物ではありませんので、単に関数を呼び出しているだけです。
 再帰関数というのは、ある関数の中で自分自身を再び呼びだし、繰り返し実行される関数です。これを利用することによって、For文やWhile文で強引に繰り返しで実行できる処理のほかにも、面倒な処理もかなり短いコーディングで済ませることが出来るようになります。

 基本的に関数内で定義された変数のスコープはその実行中の関数のプロセス内であり、その有効期限はプロセスが実行されている間だけになります。この事から、必要な情報は引数として渡し、その結果は返り値で返す方法を取ることになります。グローバル変数に対して処理を繰り返す方法を取ることも出来ますが、それは関数の独立性を損ないカプセル化の考え方に反するので、出来るだけ関数は独立した形で使うことを心がけるようにしましょう。

 では簡単な例として有名な整数の階乗計算ルーチンを2通り載せます。

function kai1(int num):integer;
var
 i:Integer;
begin
 result := 1;
 if num > 1 then
  for i := num downto 1 do result := result*i;
end;

 これは再帰を使わないで階乗を求める関数です。すぐ分かるでしょう。downtoを使っている意味は全くありませんが、次の関数に似せるために大きな数からかけていくようにしました。では、再帰を用いた関数はというと、

function kai2(int num):integer;
begin
 if num > 1 then result:=num*kai2(num-1)
 else result := 1;
end;

 単純にこんな感じです。こんな簡単なコーディングで良いわけです。この場合、関数内スコープの変数はnumです。もし、numが1よりも大きければそれよりも1小さい数の階乗をkai(num-1)で求めさせ、それにnumをかけることでnumの階乗を求めます。もしnumが1以下であれば、関数は1を返します。(0!=1を前提として)
 問題は負数が入力されたときの事ですが、それはユーザプログラム側でフールプルーフ(ユーザの誤った操作を判別し、予定外の動作を防ぐこと)するようにしましょう。まあ、機構上無限ループに陥る可能性はないので安心ですが。

 今回はこれだけです。次に続きますよ。

 NEXT