0

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

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

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

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

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

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

4

3 回答 3

1

您的方法是一个好的开始,尽管您需要按照您的要求处理负指数。充分利用这一事实x^(-n) = 1.0 / x^n

于 2013-03-13T18:25:19.957 回答
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
}

当然你应该给它一个有意义的名字,因为现在它确实可以处理否定的情况。

于 2013-03-13T18:28:16.463 回答
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);
}
于 2018-03-26T14:35:12.937 回答