再帰はJavaでどのように実装されていますか? 私の質問は、Java で再帰的メソッドが実行されたときに背後で何が起こるかについてです。スタックを使用していることは漠然と理解していますが、例を挙げて明確な説明を探しています。
2 に答える
Javaでは、再帰は他の(命令型)言語とそれほど異なる方法で処理されません。
すべてのメソッド呼び出しのスタックフレームを保持するスタックがあります。そのスタックは呼び出しスタックです(または、コンテキストによって意味が明確になる場合は、単に「スタック」)。スタック上の要素は「スタックフレーム」と呼ばれます。
スタックフレームは、渡されたメソッド引数とメソッド呼び出しのローカル変数(および場合によってはリターンアドレスなどの他のデータ)を保持します。
メソッドがそれ自体(または実際には任意のメソッド)を呼び出すと、新しく呼び出されたメソッドのパラメーターとローカル変数用に新しいスタックフレームが作成されます。
メソッドの実行中、コードは現在の(つまり最上位の)スタックフレームの値にのみアクセスできます。
このようにして、単一の(ローカル)変数が同時に多くの異なる値を持つように見えます。
再帰は、複数のスタックフレームが同時に同じメソッドの呼び出しを表すことを除いて、通常のメソッド呼び出し以外の方法では処理されません。
メソッドが呼び出されると、そのパラメーター、ローカル変数、および戻りアドレスを保持するためのスペースが必要になります。このスペースはアクティベーション レコード (スタック フレーム) と呼ばれます。
再帰は、たまたま呼び出し元と同じ名前を持つメソッドを呼び出しているため、再帰呼び出しは文字通りそれ自体を呼び出すメソッドではなく、同じオリジナルの別のインスタンス化を呼び出すメソッドのインスタンス化です。これらの呼び出しは、異なるアクティベーション レコードによって内部的に表されます。つまり、システムによって区別されます。