Java 関数の再帰呼び出しによって引き起こされるスタック オーバーフローを回避するにはどうすればよいですか?再帰の代わりにループを使用します。深い再帰を避けてください。末尾再帰を使用します。スタックサイズの制限を設定します。
Java 関数の再帰呼び出しによるスタック オーバーフローを回避する
再帰関数は Java では非常に便利ですが、不適切に使用するとスタック オーバーフロー エラーが発生する可能性があります。スタック オーバーフローは、関数呼び出しの数が大きくなりすぎて、使用可能なメモリが使い果たされると発生します。
スタック オーバーフローが発生する仕組み
関数が再帰すると、新しいスタック フレームが作成されます。各スタック フレームには、関数のローカル変数と戻りアドレスが含まれています。関数が何度も再帰すると、スタック フレームの数が使用可能なメモリを超え、スタック オーバーフローが発生します。
スタック オーバーフローを回避するためのヒント
Java 関数での再帰呼び出しのスタック オーバーフローを回避するためのヒントをいくつか紹介します:
実践例
フィボナッチ数を計算する次の再帰関数を考えてみましょう:
public static int fib(int n) { if (n <= 1) { return n; } else { return fib(n - 1) + fib(n - 2); } }
この関数は再帰が深すぎるため、n の値が大きい場合、スタック オーバーフローが発生します。これを回避するには、再帰の代わりにループを使用します。
public static int fib(int n) { int a = 0; int b = 1; for (int i = 0; i < n; i++) { int temp = a; a = b; b = temp + b; } return a; }
このループ バージョンは新しいスタック フレームを作成しないため、スタック オーバーフローは発生しません。
以上がJava 関数の再帰呼び出しによるスタック オーバーフローを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。