修复递归取幂方法?

时间:2016-04-13 17:35:55

标签: java

我目前正在研究一种使用递归进行取幂计算的方法。以下是我到目前为止的情况:

public static long exponentiation(long x, int n) {

    if (n == 0) {
        return 1;
    } else if (n == 1) {
        return x;
        // i know this doesn't work since im returning long
    } else if (n < 0) {
        return  (1 / exponentiation(x, -n));
    } else {
        //do if exponent is even
        if (n % 2 == 0) {
            return (exponentiation(x * x, n / 2));
        } else {
            // do if exponent is odd
            return x * exponentiation(x, n - 1);
        }
    }
}

我有两个问题。第一个问题是我不能做负面指数,这不是一个主要问题,因为我不需要做负指数。第二个问题,是某些计算给我错误的答案。例如2 ^ 63给出了正确的值,但它给了我一个负数。并且2 ^ 64并且只是给我0.是否有我解决这个问题?我知道我可以将long&#39}切换到double,我的方法将完美无缺。但是,我的教授要求我们使用long。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

long可以表示的最大值是2 ^ 63 -1。因此,如果你计算2 ^ 63,那么它就比那个长期可以容纳和包裹的更大。使用{{3}}表示长。

只需改变长到两倍并不完全有效。它改变了方法的语义。浮点数具有有限的精度。使用64位浮点数,您仍然可以仅表示与64位整数相同的数字量。它们的分布不同。 long可以代表每个整数 - 2 ^ 63和2 ^ 63-1。双精度数也可以表示数字的分数,但是在高数字时,它甚至不能代表每个数字。

例如,您可以在100000000000000000000000000000000000000000000000000之后表示的下一个双倍是100000000000000030000000000000000000000000000000000 - 这样您就可以使用高达30000000000000000000000000000000000的万亿,而不能用双倍代表。

您正在尝试修复一些您不应该为修复而烦恼的事情。使用long,您的方法可能返回固定的最大返回值。你的方法应该清楚地说明如果它溢出会发生什么,你可能想要处理这样的溢出(例如使用Math#multiplyExactly),但如果long是你应该返回的返回值,那么你应该使用的是