该方法适用于计算器,应该返回log2(n)。使用的所有方法(monus是负拼写错误)power(ect)都是正确写入的。 s(n)只增加一个到n和p(n)减去一个。
当我在main中调用方法时,它会获得正确的余数,但总是为答案返回0。这让我很困惑。我确信这与我每次调用方法时重新初始化0的事实有关,但不应该没关系,因为在它返回任何东西之前总是要设置为x?
x是一个私有静态变量,在方法外部已设置为0。
public static long v(long n)
{
long answer =0;
if (power(2,x) > n)
{
x = p(x);
setRemainder(monus(n,power(2,x)));
answer = x;
}
else if(power(2,x) ==n)
{
setRemainder(0);
answer = x;
}
else
{
x = s(x);
v(n);
}
x=0;// reset x so it can be used again.
return answer;
}
任何人都可以帮助我吗?
答案 0 :(得分:1)
您应该更改以下行:
v(n);
到:
answer = v(n);
现在,如果执行了最后一个else块,则答案变量不会改变 - 所以它仍为0。
答案 1 :(得分:0)
如评论中所述,您在else
语句中进行递归调用,但在递归调用返回时不要将此值分配给任何内容。
考虑一下:
第一次调用时:x = 0
所以可能会转到else语句并输入递归。在递归的某个时刻,你的一个条件语句将成立,在这种情况下会返回answer
,但不会以递归调用堆栈的形式返回。
所以看起来像这样:
1: v(n) // this calls v(n) again
2: v(n) returns answer = x // this returns an answer
1: returns answer = 0 // now the return falls down a level to where the recursive
// call was and the answer is lost as was not assigned