-3

请告诉我如何确定递归的深度?我有两个递归函数的代码:

public class MyClass {
    int ReccusionFunc1(int tmp0, int tmp1, int tmp2) {
        return ReccusionFunc1(tmp0, tmp1, tmp2);
    }
}

public class MyClass {
    int ReccursionFunc2(int tmp0, int tmp1, int tmp2) {
        int a = tmp0 + tmp1;
        int b = tmp1 + tmp2;
        int c = tmp2 + tmp0;
        return ReccusionFunc2(a, b, c);
    } 
}

这两个无限递归中的哪一个会因错误 StackOverflowError 而失败
?Сan 它是通过分析计算还是定义?

4

4 回答 4

4

请告诉我如何确定递归的深度

传递一个参数,该参数将在递归方法(ReccursionFunc1ReccursionFunc2)的每次调用中增加。

这两个无限递归中的哪一个将失败并出现错误 StackOverflowError 较早

在堆栈上分配更多内存的 id ReccursionFunc2

Сan 它是通过分析计算还是定义?

不可以,这取决于环境。

于 2013-10-31T20:33:34.483 回答
0

设置一个全局计数器变量。在第一次循环调用之前初始化它。然后在每次调用时增加它。并在您跳出循环语句时输出该值。

或者

在调用循环方法之前初始化一个整数,然后使您的循环方法将整数作为输入,递增并返回它(如果您需要返回多个东西,请将其与其他东西一起放入数组中),然后输出最后。

如果无限循环循环是一个问题。在某个地方设置一个“上限” if 语句,在任意上限处将过程从循环循环中中断。但是,这表明您的实施不正确,不应将其视为“好的”解决方案。例如,如果您尝试挖掘视图层次结构(iOS / android / 等),因为您不知道特定的 superView 在哪里。您可能需要某种上限,因为层次结构可能很大。您应该确切地知道您要查找的视图在层次结构堆栈中的位置,而不是递归搜索它。

于 2013-10-31T20:36:40.060 回答
0

为了确定递归深度,您可以添加其他参数:

public class MyClass {
int ReccusionFunc1(int tmp0, int tmp1, int tmp2, int depth) {
    return ReccusionFunc1(tmp0, tmp1, tmp2, ++depth);
}

new MyClass().ReccusionFunc1(1, 2, 3, 1);

public class MyClass {
int ReccursionFunc2(int tmp0, int tmp1, int tmp2, int depth) {
    int a = tmp0 + tmp1;
    int b = tmp1 + tmp2;
    int c = tmp2 + tmp0;
    return ReccursionFunc2(a, b, c, ++depth);
}

new MyClass().ReccursionFunc2(1, 2, 3, 1);
于 2013-10-31T20:50:28.253 回答
0

重复时输出一个计数器>.>

于 2013-10-31T20:33:22.183 回答