26.1.5.8 再帰呼び

高さkの三角形 = 高さk-1の三角形 + 長さkの底辺

の部分だけ,まず作ってみましょう.

static void triangle(int k){
   int i;
   triangle(k-1);
   for(i=1; i<=k; i=i+1)
       System.out.print('*');
   System.out.println();
}

このメソッドを,例えばtriangle(3)と呼び出したとします.すると,最初はk=3としてこのメソッドの実行が始められますが,すぐにtriangle(2)の呼出しがあります.自分自身がまた呼ばれてしまいました.どうなるでしょうか.

これまでは,メソッドは「呼び出される以前から」ずっと一つだけ存在するように説明しましたが,実はそれは不正確です.メソッドは,「文面に書かれているように定義されている」だけで,普段は存在していません.呼び出されて始めて「定義のコピーが一つ作られる」のです.そして,そのメソッドの実行が終了すると,そのコピーは消されて跡形もなくなります.

あるメソッドのコピーの実行(例えばtriangle(3))が終らないうちに同じメソッドが呼ばれる(例えばtriangle(2))と,第二のコピーが作られ,そちらが実行されます.ですから「自分自身が呼ばれる」という言い方は若干不正確であることになります.なお,triangle(3)の実行は,triangle(2)の実行が終了するまで「待ち状態」となります.

さて,このままだどtriangle(3),triangle(2),triangle(1),triangle(0),triangle(-1),triangle(-2),…と無限にコピーが作られ続けてしまいます.実際,この通りのプログラムを実行すると「作業領域が足りません」というメッセージが出て終わってしまいます.コピー用の領域を使い尽してしまうからです.こうならないためには,「高さ0の三角形」を考える必要があります.