java - 检查方法是否被递归调用的正确方法

原文 标签 java recursion

重要提示:示例错误,我在底部解释了原因

正如标题所述,问题即将定义一种方法来确定何时以递归方式调用当前执行方法。

我考虑过有一个“查询方法”,它返回一个 boolean 值,指示调用者方法(即调用“查询方法”的方法)是否已经被调用过。

如何检查:只需查看 堆栈跟踪 看看方法我们要检查 数字两次或多次堆栈跟踪 .

解释完之后,这里是一个方法的实现和它的各自使用。

这是不正确的...

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));
    }

}

我意识到如果不同 namespace (类或实例)中的方法具有相同的名称,它将返回递归调用。我认为我们到目前为止得到的一个解决方案是正确的;) jeje。

这对我有用......有没有更好的方法来归档我的目标?如何判断当前执行方法何时被递归调用?

最佳答案

这个怎么样:你的方法通过了 boolean到下一次调用递归方法,告诉它它已被递归调用:

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!
    }
}

关于java - 检查方法是否被递归调用的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17886434/

相关文章:

java - GbaRequest:构造函数调用222 userAgent Apache-HttpClient/UNAVAILABLE解析XML文件

scala - 两个函数之间的尾递归

java - 未注册单选按钮的更改

java - 关闭/清除 Jni 连接

c++ - 计算第n个加泰罗尼亚语数字

c - 数组的整数子集的总和,获取所有结果而不是第一个结果

algorithm - 如何在给定后序遍历的情况下构造 BST

java - 尾递归-Java

java - AchartEngine 中折线图的渐变颜色

java - 在JVM上进行定期线程转储-ThreadMXBean与JVMTI代理