0

for ( ; ; )やのようなループを見てきwhile (true )ました。

多くのプログラムは、この手法を使用してループを無限に実行します。再帰を使用して同じ手法を適用することは可能ですか?

4

3 に答える 3

4

いいえ。再帰のすべてのレベルは、内部使用とローカル変数のために新しいフレームをスタックに配置します。

深さのすべてのレベルが追加されると、最終的には、このスタック専用の有限量のメモリの終わりに到達します。最後のフレームと任意の C++ 領域用に予約されたシャドウ ゾーンがあるため、スタックがオーバーフローするのに十分なヒットです。

Java メソッドは、スタック スペースを超えることなくネイティブ コードを呼び出すことができるように、スタック スペースがスタックの末尾に向かって固定距離で使用可能であることを確認するコードを生成します。スタックの最後に向かうこの距離は、「シャドウ ページ」と呼ばれます。シャドウ ページのサイズは、プラットフォームに応じて 3 ~ 20 ページです。この距離は調整可能であるため、デフォルトの距離よりも長い距離を必要とするネイティブ コードを含むアプリケーションでは、シャドウ ページのサイズを増やすことができます。

これは、スタックの終わりを確実に検出できないネイティブ コードを入力する場合に使用されます。ネイティブ コードで行われる再帰または呼び出しのための十分なスペースがスタックにない場合、真のハード スタック オーバーフローが発生し、厄介な結果を招く可能性があります。

Java は末尾再帰の最適化を実行しないため、再帰はコンパイラーによって反復に変換されないことに注意してください。

于 2013-08-14T15:34:22.860 に答える
1

関数が自分自身を呼び出すたびに、スタック スペースが消費されます。スタックは有限のリソースであるため、プログラムは最終的にスタック領域を使い果たし、強制終了されます。

とはいえ、末尾呼び出しの最適化をサポートする JVM で無限ループを作成することは可能です。

ただし、そのような JVM については知りません。詳細な説明については、 「JVM はテール コールの最適化を防止しますか?」を参照してください。

于 2013-08-14T15:48:21.833 に答える