递归码功率函数

时间:2017-03-17 12:56:16

标签: java recursion

我已经实现了一个递归函数来计算child_added

x
y

该方法应返回x ^ y的值,但即使public static int power(int x, int y){ if(y>0){ x = x*x; power(x,y-1); } return x; } 大于x,它也会返回原始的y平方值(x ^ 2),我错过了什么?

2 个答案:

答案 0 :(得分:10)

你没有返回递归结果(当你递归时)。变化

power(x,y-1);

return power(x,y-1);

此外,您的最终回报应为1(因为这是<= 0案例)。变化

return x;

return 1;

实际上,正如评论中指出的那样,你的算法比我想象的更有缺陷。它应该像

if (y > 0) {
    return x * power(x, y - 1);
}
return 1;

如果您想支持更大范围的值,那么您可以改为x longreturn BigInteger。如果我们对问题应用一点 math ,我们也可以优化算法。像

这样的东西
public static BigInteger power(long x, int y) {
    if (y < 0) { // <-- throw an error on negative values for y
        throw new UnsupportedOperationException(String.format( //
                "Cannot calculate power(%d, %d).", x, y));
    } else if (y == 0) { // <-- x^0 = 1
        return BigInteger.ONE;
    } else if (y == 1) { // <-- x^1 = x
        return BigInteger.valueOf(x);
    } else if (y == 2) { // <-- x^2 = x * x
        BigInteger bi = BigInteger.valueOf(x);
        return bi.multiply(bi);
    }
    // x^y = x^(y/2) * x^(y/2)
    final int half = (y / 2);
    if (y == 2 * half) { // <-- handle even y values
        return power(x, half).multiply(power(x, half));
    } else { // <-- handle odd y values
        return power(x, half).multiply(power(x, 1 + half));
    }
}

答案 1 :(得分:0)

让我稍微改写一下,以揭露一个额外的缺陷(通过更多的灾难):

public static int power(int x, int y){
 return y == 0 ? 1 : x * power(x, y-1);
}

想象一下:

power(2,-1);