使用递归我如何更新本地变量

时间:2011-11-01 16:57:35

标签: java recursion int

使用递归如何更新局部变量直到满足条件。我在下面有一个实例解释了为什么问题很好。 count变量是一个局部变量,并且方法经过计数的时间设置为0.我不能将计数移动到方法之外它必须是局部变量而不是静态或其他任何东西..所需的输出应该是(3 6 )

public static int returnInt(int b) {

        int count = 0;

        if (b == 6) {

            System.out.println(count + " " + b);
        }

        b += 2;
        count++;

        return returnInt(b);

    }

5 个答案:

答案 0 :(得分:5)

count作为附加参数传递给方法:

public static int returnInt(int b, int count) {

    ... do some stuff to b, print something, check whether end-condition has been met ...

    return returnInt(b, count + 1);
}

然后,使用returnInt的额外参数调用0以启动操作。

答案 1 :(得分:1)

public static int returnInt(int b) {
    return returnInt(b, 0);
}

private static int returnInt(int b, int count) {    
    if (b == 6) {
        System.out.println(count + " " + b);
        // My guess is you should be returning something here???

        // Actually, this shouldn't be your exit point from the recursion because depending on the starting value of b, since you are always adding 2, it might never equal 6, so again you would get a StackoverflowException.
    }    
    b += 2;
    count++;

    return returnInt(b, count);
}

答案 2 :(得分:1)

你做不到。根据定义,局部变量是本地的。它仅存在于方法的当前执行范围内。

但是你有以下解决方案。

最好的方法是将其作为方法的参数传递(与其他参数b完全相同。

public static int returnInt(int b) {
    return returnInt(b, 0)
}
private static int returnInt(int b, int count) {
    // your code here. 
}

如果(出于某些奇怪的原因)您无法更改方法签名,则可以将此变量放入ThreadLocal。在这种情况下,即使多个线程同时执行您的方法,您的代码仍保持线程安全。

将此变量移动到类级别是最糟糕的解决方案,因为它不是线程安全的并且会破坏封装。

答案 3 :(得分:1)

此功能将溢出堆栈。使用递归时必须提供一种方法。至于变量计数,你每次都将它重新定义为0;它不能在递归函数内初始化。尝试将其作为参数传递给您的函数,并为您的函数提供出路。

public static int returnInt(int b,int count) {

    if (b == 6) {

        System.out.println(count + " " + b);
        return b;
    }
    b+=2;
    count++;
    return returnInt(b);
}
'返回b'行可以成为你的出路...你不必返回b ...返回你需要的任何东西。

答案 4 :(得分:0)

通常,创建returnIntInner(int b,盒装计数),将大部分逻辑移到那里,然后从“瘦”版本的returnInt中调用它。对于框count,“旧样式”的方法是将计数作为int [1]数组传递,以便可以返回 - 我没有研究新的Java参考parm语法。但由于您的代码是尾递归的,并且在递归调用后无需访问count,因此您只需将count作为常规参数传递。