Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取递归调用中函数的阶数_Java_Recursion - Fatal编程技术网

Java 获取递归调用中函数的阶数

Java 获取递归调用中函数的阶数,java,recursion,Java,Recursion,在递归调用中检索函数顺序的最简单方法是什么。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本情况,然后一次返回一个函数。第一个函数返回的顺序为0,第二个函数返回的顺序为1,依此类推……检索订单信息的简单方法是什么?比如说,当它是三阶函数时,我想做一些特别的事情 编辑:我希望堆栈顶部的函数为零 Edit2:我试图解决的问题是返回二叉树的顺序遍历的第n个元素 如果您从如下所示的递归函数开始 void recursive(int p1, String p2, long p3) {

在递归调用中检索函数顺序的最简单方法是什么。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本情况,然后一次返回一个函数。第一个函数返回的顺序为0,第二个函数返回的顺序为1,依此类推……检索订单信息的简单方法是什么?比如说,当它是三阶函数时,我想做一些特别的事情

编辑:我希望堆栈顶部的函数为零


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来增加堆栈。但尽管如此,每个方法调用都意味着开销,如果递归预期会很深,那么我们绝对应该避免这种情况。