再帰的
概観
- 現在のメソッドで自分自身を呼び出すこの現象を指します
public static void main(String[] args){
a();
}
public static void a(){
a();
}
再帰的な分類
- 再帰には、直接再帰と間接再帰の2つのタイプがあります。
- 直接再帰は、独自のメソッドを呼び出すことです
- 間接再帰は、メソッドAがメソッドBを呼び出し、メソッドBがメソッドCを呼び出し、メソッドCがメソッドAを呼び出すと理解できます。
public static void a(){
b();
}
public static void b(){
c();
}
public static void b(){
a();
}
注意が必要な事項
- 再帰を確実に停止するには、再帰を条件付きで制限する必要があります。そうしないと、スタックメモリオーバーフローが発生します。
- 再帰には限られた条件がありますが、再帰の回数は多すぎてはなりません。そうしないと、スタックメモリオーバーフローが発生します。
- コンストラクタ、再帰を禁止する
スタックメモリオーバーフローが発生するのはなぜですか。!!
aメソッドは常にスタックメモリ内のaメソッドを呼び出すため、スタックメモリ内に無数のメソッドが発生します。
メソッドが多すぎます。スタックメモリのサイズを超えると、メモリオーバーフローエラーが発生します。
メソッドが他のメソッドを呼び出すと、メソッドは呼び出されますメソッドが完了していない場合、呼び出されたメソッドは実行を継続し、実行が完了した後にのみ、実行を継続します
前提条件
- メソッドを呼び出すとき、メソッドの本体は変更されないままで、メソッドのパラメーターが異なる方法で呼び出されるたびに、再帰を使用できます
public class Demo01Recursion {
public static void main(String[] args) {
recursion(1);
}
private static void recursion(int i) {
System.out.println(i);
if (i == 10000) {
return;
}
recursion(++i);
}
}
- 構築方法では、再帰は許可されておらず、コンパイル時にエラーが報告されます
デモケース-1
- 1 + nの結果を計算します。nは渡されるパラメーターです。n= 3の場合、結果は1 + 2 + 3の結果です。
public class Demo02Recursion {
public static void main(String[] args) {
// 1+2+3.....+100=
int num = num(100);
System.out.println(num);
}
private static int num(int i) {
if (i == 1) {
return 1;
}
return i + num(i - 1);
}
}
結果は5050です
操作を分析する
これはスタックメモリの場合です
デモケース-2
- ドライブ文字の下にあるすべてのサブファイルとサブフォルダーを印刷します
public class Demo03Recursion {
public static void main(String[] args) {
// 模拟打印文件夹下所有文件和文件夹
getAllFile(new File("D:\\software"));
}
public static void getAllFile(File dir) {
// 打印目录名称
System.out.println(dir);
File[] files = dir.listFiles();
for (File file : files) {
// 如果是文件夹
if (file.isDirectory()) {
getAllFile(dir);
} else {
// 打印文件
System.out.println(file);
}
System.out.println(file);
}
}
}
この目的のために、デモは特別に3つのフォルダーと3つのサブファイルを作成しましたが、多すぎません。それ以外の場合、スタックメモリオーバーフローの例外は実行時に直接報告されます。