是否可以计算没有变量的递归深度?
答案 0 :(得分:1)
你在找这样的东西吗?
public int foo(int count) {
if (exitCondition) return count;
foo(count+1);
}
计算调用的其他方法包括反射或使用字节码修改库(即AoP)。
答案 1 :(得分:1)
在java中,
Thread.currentThread().getStackTrace()
可用于确定呼叫深度。递归调用的数量是堆栈长度和第一帧的位置之间的差异。
或抛出异常,然后从最顶层的函数中检索堆栈:
Throwable.getStackTrace()
返回堆栈跟踪元素的数组,每个元素代表一个堆栈帧。数组的第0个元素(假设数组的长度为非零)表示堆栈的顶部,这是序列中的最后一个方法调用。通常,这是创建和抛出此throwable的点。数组的最后一个元素(假设数组的长度为非零)表示堆栈的底部,这是序列中的第一个方法调用。
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html
答案 2 :(得分:0)
你的问题非常模糊,所以我做了几个假设:
因此,如果您使用某种随机方法并调用递归函数:
public void randomMethod() {
Something somethingToRecurseOn = ... ;
int depth = recurse(somethingToRecurseOn);
}
这是我的解决方案的预期用途。这是recurse
方法:
public int recurse(Something s) {
Something subS = s.getSubS();
if (subS == null) { // Exit condition
return 1;
}
// Do something with subS
return recurse(subS) + 1;
}
您将深度集成到函数的返回值中,并假设退出条件的深度为1。
这实际上与我过去问过的面试问题有关,你必须在递归序列中返回元素的数量,签名是:
public int collatz(int n)
其中n
是您正在操作的数字,用于查找序列的下一个数字,停止为1.如果使用递归而不是迭代实现,则它实际上返回递归深度。