高さ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の三角形」を考える必要があります.
26.1.5.7 自己の利用 | 26.1.5.8 再帰呼び | 26.1.5.9 再帰メソッド | ||
2009年度版に向けて現在作業中です.
このページに関してお気づきの点がありましたら
コメント投稿システムまでお願いします.
|
Wed, 09 Feb 2005 01:42:48 JST (1634d) |