这种递归方法有什么问题? (Java)的

时间:2013-11-17 21:38:49

标签: java

该方法适用于计算器,应该返回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;

}

任何人都可以帮助我吗?

2 个答案:

答案 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