我需要编写一个方法,它将取一个基数并将其提升为任何整数幂,正或负。可以假设基数不是0。
在方法中,我需要调用一个递归方法并使用它。
以下是我需要使用的先前递归方法:
public static double nonNegInt(double base, int pow)
{
if (pow == 0)
return 1;
else
return base * nonNegInt(base,pow-1);
}
所以我的问题是,有人可以帮助或告诉我如何编写我需要的方法吗?
我知道当前的方法很好,但我需要用另一种方法调用它。当我这样做时,我收到运行时错误
答案 0 :(得分:1)
您的方法是一个良好的开端,但您需要处理您的要求中所述的负指数。利用x^(-n) = 1.0 / x^n
。
答案 1 :(得分:0)
这也是你处理负值的方法:
public static double nonNegInt(double base, int pow)
{
if (pow == 0)
return 1;
else if(pow < 0)
return (1 / nonNegInt(base, -pow));
else
return base * nonNegInt(base,pow-1);
}
运行它:
public static void main(String args[])
{
double result = nonNegInt(4,-1);
System.out.println(result); //Will print 0.25
}
当然你应该给它一个有意义的名字,因为现在确实处理负面案例。
答案 2 :(得分:0)
public BigDecimal exp(BigDecimal base, BigInteger pow) {
if(base == null || base.intValue() == 0 ) return BigDecimal.ZERO;
BigInteger absPow = pow.abs();
if(absPow.intValue() == 0) return BigDecimal.ONE;
if(absPow.intValue() == 1) return pow.intValue() > 0 ? base :
BigDecimal.ONE.divide(base, MathContext.DECIMAL128);
if(absPow.intValue() == 2) return pow.intValue() > 0 ? base.multiply(base):
BigDecimal.ONE.divide(base.multiply(base), MathContext.DECIMAL128);
BigInteger i = BigInteger.ONE;
BigDecimal result = base;
HashMap<BigInteger, BigDecimal> history = new HashMap<>();
history.put(i, result);
while (i.compareTo(absPow) < 0) {
if(i.add(i).compareTo(absPow) <= 0) {
i = i.add(i);
result = result.multiply(result);
history.put(i, result);
} else {
BigInteger diff = absPow.subtract(i);
for (; diff.intValue() > 0 && !history.containsKey(diff); diff = diff.subtract(BigInteger.ONE));
i = i.add(diff);
result = result.multiply(history.get(diff));
history.put(i, result);
}
}
return pow.intValue() > 0 ? result : BigDecimal.ONE.divide(result, MathContext.DECIMAL128);
}