再帰時のJava IOストリーム

ここに画像の説明を挿入

再帰的

概観

  • 現在のメソッドで自分自身を呼び出すこの現象を指します
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つのサブファイルを作成しましたが、多すぎません。それ以外の場合、スタックメモリオーバーフローの例外は実行時に直接報告されます。

元の記事24件を公開 賞賛された33件 訪問2391件

おすすめ

転載: blog.csdn.net/weixin_41241629/article/details/104306416