Java指数方法

时间:2013-03-13 18:18:54

标签: java methods recursion raise

我需要编写一个方法,它将取一个基数并将其提升为任何整数幂,正或负。可以假设基数不是0。

在方法中,我需要调用一个递归方法并使用它。

以下是我需要使用的先前递归方法:

 public static double nonNegInt(double base, int pow)
{
    if (pow == 0)
    return 1;
    else
     return base * nonNegInt(base,pow-1);   
}

所以我的问题是,有人可以帮助或告诉我如何编写我需要的方法吗?

我知道当前的方法很好,但我需要用另一种方法调用它。当我这样做时,我收到运行时错误

3 个答案:

答案 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);
}