再帰呼び出し
日本語 | 再帰呼び出し、再帰呼出 |
英語 | recursive call |
ふりがな | さいきよびだし |
フリガナ | サイキヨビダシ |
メソッドが、自分自身のメソッドを呼び出すこと。
メソッドは、そのメソッドを再び呼び出すことができる。これを「再帰呼び出し」と言う。
特に特別な文法は必要なく、そのまま呼び出すことができる。同じメソッドなので「同じローカル変数には同じ値が入っているのか?」と思いがちだが、ローカル変数はブロックに入るたびに新しく作られるため、重複することはない。再帰呼び出しを行うたびに、そのメソッド内での処理は「新規に行われる」と考えた方がいいだろう。
再帰呼び出しを行うことで、メソッドの処理を複数回繰り返すことができる。つまりwhileやforといったループ処理に似たことができる。
当然、while等と同じように「特定の条件では再帰呼び出しを止める」処理が必要となる。再帰呼び出しを止めるためには、次のメソッドを呼ばずにreturnでメソッドが抜ける、というのをこれまで呼んできたメソッドで行うようにすればよい。また、条件のチェックを行うために、引数に値を渡すかフィールドで値を持つ必要がある。
再帰呼び出しはwhile等のループの代替品ではない。
条件のチェックや、ループの終了方法が複雑になる傾向があるため、再帰呼び出しはwhile等のループに比べてバグを生み出しやすい。また、テクニカルな面があるため、自分に実力があると「使いたくなってしまう」傾向にある。
まずそれがwhile等のループで行えないかどうか確認し、単純なループ処理では行えない、もしくは再帰呼び出しの方がシンプルにプログラムを作ることができる場合にのみ再帰呼び出しを使用した方が良いだろう。
メソッドは、そのメソッドを再び呼び出すことができる。これを「再帰呼び出し」と言う。
特に特別な文法は必要なく、そのまま呼び出すことができる。同じメソッドなので「同じローカル変数には同じ値が入っているのか?」と思いがちだが、ローカル変数はブロックに入るたびに新しく作られるため、重複することはない。再帰呼び出しを行うたびに、そのメソッド内での処理は「新規に行われる」と考えた方がいいだろう。
再帰呼び出しを行うことで、メソッドの処理を複数回繰り返すことができる。つまりwhileやforといったループ処理に似たことができる。
当然、while等と同じように「特定の条件では再帰呼び出しを止める」処理が必要となる。再帰呼び出しを止めるためには、次のメソッドを呼ばずにreturnでメソッドが抜ける、というのをこれまで呼んできたメソッドで行うようにすればよい。また、条件のチェックを行うために、引数に値を渡すかフィールドで値を持つ必要がある。
再帰呼び出しはwhile等のループの代替品ではない。
条件のチェックや、ループの終了方法が複雑になる傾向があるため、再帰呼び出しはwhile等のループに比べてバグを生み出しやすい。また、テクニカルな面があるため、自分に実力があると「使いたくなってしまう」傾向にある。
まずそれがwhile等のループで行えないかどうか確認し、単純なループ処理では行えない、もしくは再帰呼び出しの方がシンプルにプログラムを作ることができる場合にのみ再帰呼び出しを使用した方が良いだろう。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// 再帰呼びするメソッドを呼び出します。
Sample sample = new Sample();
sample.recursiveMethod( 0 );
// 1
// 2
// 3
// 4
// 5
}
/**
* 再帰呼び出しするメソッド。
*/
private void recursiveMethod( int i )
{
// iをインクリメントします。
++i;
if( i > 5 )
{
// i が5以上なら終了。
// この「ストッパー」がないと再帰呼び出しは止まりません。
return;
}
// iを出力。
System.out.println( i );
// そして、自分自身を呼び出します。
// これが再帰呼び出しになります。
recursiveMethod( i );
}
}
public class Sample
{
public static void main( String[] args )
{
// 再帰呼びするメソッドを呼び出します。
Sample sample = new Sample();
sample.recursiveMethod( 0 );
// 1
// 2
// 3
// 4
// 5
}
/**
* 再帰呼び出しするメソッド。
*/
private void recursiveMethod( int i )
{
// iをインクリメントします。
++i;
if( i > 5 )
{
// i が5以上なら終了。
// この「ストッパー」がないと再帰呼び出しは止まりません。
return;
}
// iを出力。
System.out.println( i );
// そして、自分自身を呼び出します。
// これが再帰呼び出しになります。
recursiveMethod( i );
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // 再帰呼びするメソッドを呼び出します。 Sample sample = new Sample(); sample.recursiveMethod( 0 ); // 1 // 2 // 3 // 4 // 5 } /** * 再帰呼び出しするメソッド。 */ private void recursiveMethod( int i ) { // iをインクリメントします。 ++i; if( i > 5 ) { // i が5以上なら終了。 // この「ストッパー」がないと再帰呼び出しは止まりません。 return; } // iを出力。 System.out.println( i ); // そして、自分自身を呼び出します。 // これが再帰呼び出しになります。 recursiveMethod( i ); } }