我正在尝试学习递归,它的行为非常奇怪。我有以下简单的方法来减少给定值并将偶数相加,直到值变为0.但是一旦值= 0,它会以某种方式开始只访问递归调用(处于IF-ELSE条件)并启动增加我的价值并再次添加,直到它回到初始值。我录制了2个截屏视频。例如,如果我在类中创建一个main方法并用5执行方法,我会收到输出6,这是正确的,但是在JUnit测试中,对于相同的值,它需要 6 ,但是实际值 64 !我不确定我做错了什么。此外,一旦价值达到0,我会回复正确的东西吗?我不知道如何在那里返回总和,但同时将总和作为方法本身的输出返回..
class EvenSums {
private static int sum = 0;
public static int sumEvenRec(int n) {
int input = n;
if(input <= 0) {
return 0;
} else {
if(input % 2 == 0) {
sum += input;
}
sumEvenRec(input-1);
}
return sum;
}
这是调试截屏(注意输入的递减值然后递增)并注意它如何从返回值返回到递归函数,它以某种方式增加了输入的值。 的 DEBUG SCREENCAST
在测试截屏视频中,您可以看到:
对于输入2:java.lang.AssertionError: expected:<2> but was:<58>
对于输入5:java.lang.AssertionError: expected:<6> but was:<64>
对于输入6:java.lang.AssertionError: expected:<12> but was:<76>
有趣的是,输入 15 :有效!
的 TEST SCREENCAST
答案 0 :(得分:0)
您在JVM的同一次运行期间进行了许多测试,因此静态字段sum
保留了之前测试的值(这就是为什么应该避免使用静态变量或者使用它们的原因)谨慎)。
你应该消除那个字段并将sum作为递归调用的返回值传递(你已经返回一个值,但是以不同的方式进行求和)。