通过递归减少值然后意外增加值

时间:2017-10-28 15:48:21

标签: java recursion junit

我正在尝试学习递归,它的行为非常奇怪。我有以下简单的方法来减少给定值并将偶数相加,直到值变为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

1 个答案:

答案 0 :(得分:0)

您在JVM的同一次运行期间进行了许多测试,因此静态字段sum保留了之前测试的值(这就是为什么应该避免使用静态变量或者使用它们的原因)谨慎)。

你应该消除那个字段并将sum作为递归调用的返回值传递(你已经返回一个值,但是以不同的方式进行求和)。