我已经实现了一个递归函数来计算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),我错过了什么?
答案 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
long
和return
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);