Java 使用递归如何保持局部变量的更新

Java 使用递归如何保持局部变量的更新,java,recursion,int,Java,Recursion,Int,使用递归如何保持局部变量更新,直到满足条件。下面我举了一个例子,很好地解释了这个问题的原因。count变量是一个局部变量,方法每次通过count时都设置为0。我不能将计数移到方法之外,它必须是局部变量,而不是静态的或其他任何东西。。所需输出应为(3 6) 将count作为附加参数传递给方法: public static int returnInt(int b, int count) { ... do some stuff to b, print something, check whe

使用递归如何保持局部变量更新,直到满足条件。下面我举了一个例子,很好地解释了这个问题的原因。count变量是一个局部变量,方法每次通过count时都设置为0。我不能将计数移到方法之外,它必须是局部变量,而不是静态的或其他任何东西。。所需输出应为(3 6)


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);
}

然后,用一个额外的参数
0
调用
returnInt
,开始操作。

您不能这样做。局部变量定义为局部变量。它只存在于方法当前执行的范围内

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);
}
但是你有以下的解决方案

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

public static int returnInt(int b) {
    return returnInt(b, 0)
}
private static int returnInt(int b, int count) {
    // your code here. 
}
如果(出于某种奇怪的原因)无法更改方法签名,则可以将此变量放入
ThreadLocal
。在这种情况下,即使多个线程同时执行方法,代码也会保持线程安全


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

此函数将使堆栈溢出。使用递归时,必须提供一种解决方法。至于变量计数,每次都将其重新定义回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);
}

“return b”行可以是您的出路…您不必返回b…返回您需要的任何内容。

一般来说,创建returnintner(int b,boxed count),将大部分逻辑移到该行,并从returnInt的“瘦”版本调用它。要返回box
count,传统的方法是将计数作为int[1]传递数组,这样它就可以返回了——我还没有研究过新的Java参考parm语法。但是,由于您的代码是尾部递归的,并且在递归调用后不需要访问
count
,您只需将
count
作为常规参数传递即可。

为什么不允许更改任何内容?难道
count
只是
int count==b/2;
?否则您还必须将
count
变量传递给递归函数。您确实意识到
returnInt
实际上永远不会返回任何内容,对吗?:-)因为它不会停止,直到堆栈溢出崩溃。(递归算法必须有一个get out子句。)…并添加提供终止条件的逻辑。:-)@T.J.Crowder--
检查是否满足结束条件
我的回答反映了发布的代码,T.J.Crowder提出了一个重要的观点,即这将永远不会返回。请注意,如果最初调用此方法时b为奇数或已经大于6,则将永远不会满足退出条件,这是真的,这只是一个演示如何退出递归方法的示例
public static int returnInt(int b,int count) {

    if (b == 6) {

        System.out.println(count + " " + b);
        return b;
    }
    b+=2;
    count++;
    return returnInt(b);
}