我的任务是编写下面的递归方法。当我调用这个方法时,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);
}
}
}
2条答案
按热度按时间8hhllhi21#
您正在将递归结果存储在一个全局变量中。它被初始化为0;这就是为什么第一个函数调用是有效的;然而,在此之后,无论存储在
midresult
中的值是什么,都将被后面的函数调用所使用。对此
mbzjlibv2#
我不会使用静态变量来保存
midresult
。在某些情况下,这可能会导致问题。另一种选择是使用helper方法将midresult
作为参数传递。当调用原始方法时,该值将被传递给helper。这样,您就不必担心为后续使用而重置它。当然,如果你解释了你试图递归实现的整个算法,这也可以避免。你可以编辑你的问题来做到这一点。只是不要改变你现有的代码/方法,因为答案和评论是基于那个代码提供的。