Java 获取递归调用中函数的阶数
在递归调用中检索函数顺序的最简单方法是什么。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本情况,然后一次返回一个函数。第一个函数返回的顺序为0,第二个函数返回的顺序为1,依此类推……检索订单信息的简单方法是什么?比如说,当它是三阶函数时,我想做一些特别的事情 编辑:我希望堆栈顶部的函数为零Java 获取递归调用中函数的阶数,java,recursion,Java,Recursion,在递归调用中检索函数顺序的最简单方法是什么。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本情况,然后一次返回一个函数。第一个函数返回的顺序为0,第二个函数返回的顺序为1,依此类推……检索订单信息的简单方法是什么?比如说,当它是三阶函数时,我想做一些特别的事情 编辑:我希望堆栈顶部的函数为零 Edit2:我试图解决的问题是返回二叉树的顺序遍历的第n个元素 如果您从如下所示的递归函数开始 void recursive(int p1, String p2, long p3) {
Edit2:我试图解决的问题是返回二叉树的顺序遍历的第n个元素 如果您从如下所示的递归函数开始
void recursive(int p1, String p2, long p3) {
...
if (someCondition) {
recursive(nextP1, nextP2, nextP3);
}
}
将其更改为:
void recursive(int p1, String p2, long p3, int level) {
...
if (someCondition) {
recursive(nextP1, nextP2, nextP3, level+1);
}
}
现在,通过调用
recursive(initialP1, initialP2, initialP3, 0);
level
将指示您上方的递归
调用次数
编辑:(顶部为零)
您还可以将函数转换为返回其级别,以实现“顶部为零”策略:
int recursive(int p1, String p2, long p3) {
if (baseCase) {
return 0;
}
...
int level = 0;
if (someCondition) {
level = 1+recursive(nextP1, nextP2, nextP3);
}
return level;
}
请注意,在这种情况下,直到最后一次递归调用返回后,您才能找到您的级别。
- 如果级别0应该是最后一个“嵌套调用”,则通常是
不可判定的问题类似于停顿问题,因为你不能
只需说“再进行3次嵌套调用后,函数将返回一个
价值观”。只有通过模拟环境才能展望未来
特定函数的计算
- 如果级别0应该是第一个调用,那么它非常简单,您可以使用该级别作为方法的参数并递增它
顺便说一句,有趣的问题,请参见dasblink为您提供的案例与您建议的实现相反,因为级别计数器随着递归的深入而升高(递增)
如果您希望它随着递归的深入而减小,这意味着您事先知道确切的递归深度
在大多数情况下,如果您知道不使用递归的确切递归深度,那么您将使用循环(例如,while,repeat/until等)。事实上,在这种情况下使用递归并不太理想,因为递归堆栈被分配(更高的内存消耗)并且循环效率更高。听起来很有趣,你能提供更多的细节和/或代码吗?你可以使用一个参数来传递一个参数,为每个调用递增,或者只是迭代地完成整个过程。听起来您需要递归树中每个节点的深度。要在遍历的树中找到n
元素,请将a计数器传入和传出每个递归调用。同级被馈送由先前同级遍历产生的计数器。要添加到这一点,您可能希望保留原始递归函数,该函数随后使用额外参数调用新函数。这样调用方(例如,main()
)就不知道其中的区别。有趣的是,如果我希望最深的函数(堆栈顶部的函数)为零,该怎么办?@Keeto在下一次调用返回之前,您无法知道“顶部为零”的级别(因为您不知道将有多少个)。您可以从上一次调用返回级别,并向其中添加一个以了解您的级别,但您只能在“事后”执行该操作。@Keeto那么它们都是0,因为只有当前正在执行的一个(即最深的函数)可以使用该值执行任何操作。或者你想知道递归在当前调用下运行的深度,在这种情况下,你需要一个具有最大深度的可变对象,例如可以是原子整数。谢谢,这正是我想要的+1“在大多数情况下,如果你知道确切的递归深度,你就不会使用递归”这是一个完美的观察!大多数情况下,使用递归函数在语法上更简洁。如果这段代码需要重用,那么无论如何你都要编写一个函数,这样大多数人(包括我自己有时)都会在本该曲折的时候曲折前进。使用递归函数很容易导致堆栈溢出。您可以通过-ss Stacksize或-oss Stacksize来增加堆栈。但尽管如此,每个方法调用都意味着开销,如果递归预期会很深,那么我们绝对应该避免这种情况。