1

重要: 例が間違っています。理由を最後に説明します

タイトルが述べたように、質問は、現在実行中のメソッドが再帰的に呼び出されるタイミングを決定する方法を定義しようとしています。

呼び出し元メソッド (これは、「クエリ メソッド」を呼び出すメソッド) が既に呼び出されているかどうかを示すブール値を返す「クエリ メソッド」を持つことを考えています。

それを確認する方法:スタック トレースを覗いて、チェックしたいメソッドがスタック トレース2 回以上表示されているかどうかを確認します。

それを説明した後、メソッドの実装とそのそれぞれの使用法を次に示します。

これは正しくありません...

public class Test
{
    public static boolean isRecusivelyInvoqued () {
        StackTraceElement[] traces = Thread.currentThread().getStackTrace();
        boolean res = false;
        // the first belong to "getStackTrace" and the second to "isRecusivelyInvoqued" (this method)
        if (traces.length > 2) { 
            String invokedMethodName = traces[2].getMethodName(); // the third is the method we want to check
            for (int i = 3; i < traces.length && !res; i++)
            {
                res = invokedMethodName.equals(traces[i].getMethodName());
                i++;
            }
        }
        return res;
    }

    // this is a recursive method, used to verify the correct functioning
    public static int factorial (int n) {
        System.out.println(isRecusivelyInvoqued());
        if (n == 0) {
            return 1;
        }
        else {
            return n * factorial(n-1);
        }
    }


    public static void main(String[] args)
    {
        System.out.println(factorial(4));
    }

}

異なる名前空間 (クラスまたはインスタンス) のメソッドが同じ名前を持つ場合、それは呼び出された再帰的に返されます。ここまでで得た解決策の 1 つは、それが正しいということです ;) うわあ。

これは私にとってはうまくいっています...私の目標をアーカイブするためのより良い方法はありますか? 現在実行中のメソッドがいつ再帰的に呼び出されるかを判断する方法は?

4

4 に答える 4

3

これはどうですか: メソッドは、再帰的に呼び出されたことを伝えるboolean再帰メソッドの次の呼び出しに a を渡します。

public static int factorial (int n) {
    return privateFactorial(n, false);
}

private static int privatefactorial(int n, boolean calledRecursively) {
    System.out.println(calledRecursively);
    if (n == 0) {
        return 1;
    }
    else {
        return n * privateFactorial(n-1, true);  // tell next invocation here!
    }
}
于 2013-07-26T16:30:03.697 に答える
2

別のオプションは、「is_recursive_invoked」パラメーターを再帰関数に追加することです。

public static int factorial (int n, boolean isInvokedRecursively) {
    System.out.println(isInvokedRecursively);
    if (n == 0) {
        return 1;
    }
    else {
        return n * factorial(n-1, true); // these function calls are recursive
    }
}

そしてあなたのメインで:

System.out.println(factorial(4, false));  // this function call isn't recursive
于 2013-07-26T16:30:14.103 に答える