java 是否在递归方法中的变量完成后/再次调用前将其重置为零?

ux6nzvsh  于 2022-11-20  发布在  Java
关注(0)|答案(2)|浏览(234)

我的任务是编写下面的递归方法。当我调用这个方法时,midresult应该是0。如果我只调用一次这个方法,它就可以工作,但是因为我有这个midresult变量,只要我在一行中多次调用它,它就会返回错误的值,因为它会将midresult相加。
如何在每次运行完方法后将midresult设置回0?我不允许将它放在主方法中,但也不能将它放在实际的递归方法中,因为这会打乱递归,对吗?
例如,对于x=5,y=9,结果应该是15,如果我只调用一次该方法,它是有效的。但是如果我用x=5和y=9调用它,然后用其他xy值调用它,返回值是错误的。

static int midresult;

public static int recursivemethod(int x, int y) {
   // TODO
   if(x==0) {
      return y + midresult;
   }
   else{
      if((x+midresult)%2==0) {
         midresult+= (x/2);
         int temp= y;
         y=(x/2);
         x=temp;
         return recursivemethod(x, y);
      }
      else {
         midresult+= y;
         x-=1;
         y=(y/2);
         return recursivemethod(x, y);
      }
   }
}
8hhllhi2

8hhllhi21#

您正在将递归结果存储在一个全局变量中。它被初始化为0;这就是为什么第一个函数调用是有效的;然而,在此之后,无论存储在midresult中的值是什么,都将被后面的函数调用所使用。

if(x == 0) {
    return y + midresult;
}

对此

if(x == 0) {
    int temp = y + midresult;
    midresult = 0;
    return temp;
}
mbzjlibv

mbzjlibv2#

我不会使用静态变量来保存midresult。在某些情况下,这可能会导致问题。另一种选择是使用helper方法将midresult作为参数传递。当调用原始方法时,该值将被传递给helper。这样,您就不必担心为后续使用而重置它。

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

private static int recursivemethod(int x, int y, int midresult) {
    // TODO
    if (x == 0) {
        return y + midresult;
    } else {
        if ((x + midresult) % 2 == 0) {
            midresult += (x / 2);
            int temp = y;
            y = (x / 2);
            x = temp;
            return recursivemethod(x, y, midresult);
        } else {
            midresult += y;
            x -= 1;
            y = (y / 2);
            return recursivemethod(x, y, midresult);
        }
    }
}

当然,如果你解释了你试图递归实现的整个算法,这也可以避免。你可以编辑你的问题来做到这一点。只是不要改变你现有的代码/方法,因为答案和评论是基于那个代码提供的。

相关问题