4

特定のツリー トラバーサル再帰アルゴリズムが Java でスタック オーバーフローを生成する状況を理論的に (つまり、実際に実行せずに) 判断する最良の方法は何ですか?

私の質問を明確にするために、次の例を考えてみましょう。Java で実装された単純な二分木があるとします。

public class Node {
    private int value;
    private Node left;
    private Node right;
    ...

    //in-order traversal
    public void inOrder() {
        if (left != null) {
            left.inOrder();
        }
        System.out.println(value);
        if (right != null) {
            right.inOrder();
        }
    }
}

このアルゴリズムでは、ネストされた再帰呼び出しの最大数は、ツリーの深さに関して線形です。では、スタック オーバーフロー エラーをスローすることなく、順序通りのトラバーサル アルゴリズム (または類似のアルゴリズム) を完了することができるツリーの最大深さをどのように推定できますか?

-Xss オプションを使用して最大スタック サイズがスレッドによって割り当てられる場合、この数値を再帰アルゴリズムで使用される各スタック フレームの推定値に分割することは正しいですか?

また、パラメーターとローカル変数のサイズをプログラム カウンターのサイズに追加して、各スタック フレームのサイズを見積もるのは正しいですか。プログラム カウンターのサイズはアーキテクチャ (32 ビットと 64 ビットなど) によって異なります。 .

他に何か不足していますか?

アップデート:

スタック オーバーフロー エラーを回避するために、再帰アルゴリズムを反復アルゴリズムに変換できることは知っています。これは、再帰アルゴリズムに関する単なる理論上の質問です。

4

1 に答える 1