是否可以计算没有变量的递归深度?
问问题
1167 次
3 回答
1
在java中,
Thread.currentThread().getStackTrace()
可用于确定调用深度。递归调用的数量是堆栈长度和第一帧位置之间的差异。
或抛出异常,然后从最顶层的函数中检索堆栈:
Throwable.getStackTrace()
返回堆栈跟踪元素的数组,每个元素代表一个堆栈帧。数组的第零个元素(假设数组的长度不为零)表示堆栈的顶部,这是序列中的最后一个方法调用。通常,这是这个 throwable 被创建和抛出的点。数组的最后一个元素(假设数组的长度不为零)表示堆栈的底部,这是序列中的第一个方法调用。
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Throwable.html
于 2012-10-06T18:43:16.153 回答
1
你在寻找这样的东西吗?
public int foo(int count) {
if (exitCondition) return count;
foo(count+1);
}
计算调用的其他方法将涉及反射或使用字节码修改库(即 AoP)。
于 2012-10-06T18:38:53.413 回答
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 处停止。如果它是用递归而不是迭代实现的,它本质上会返回递归深度。
于 2012-10-06T19:00:13.030 回答