通用因子,如何实现

时间:2018-02-07 17:22:16

标签: java generics

我尝试使用递归来实现阶乘函数。我尝试使用泛型,但无法弄清楚如何处理1的返回。

public static <T extends Number & Comparable> T calculateFactorial(T n)  {
        if (n.compareTo(0)==0)  {
            return 1; //error
        }

        return n*calculateFactorial(n-1);
    }

我在incompatible types: int cannot be converted to T行收到return 1错误。

此外,如果我只是将return 1替换为return n,我会在error: bad operand types for binary operator '-'行上收到return n*calculateFactorial(n-1)错误。

我应该如何处理这个问题以及这样做的好习惯是什么?泛型是否应该用于此类功能?

2 个答案:

答案 0 :(得分:2)

对输入和输出使用相同的T并不是一个好主意,因为它很容易溢出原始值。您可以使用另一种方法解决此问题。

public static <T extends Number> BigInteger calculateFactorial(T t) {
    return factorial(new BigInteger(t.toString()));
}

private static BigInteger factorial(BigInteger n) {
    if (n.equals(BigInteger.ZERO)) {
        return BigInteger.ONE;
    } else {
        return n.multiply(factorial(n.subtract(BigInteger.ONE)));
    }
}

检查所有输出是否正确。他们都应该打印下面的24

System.out.println(calculateFactorial(4));
System.out.println(calculateFactorial(4L));
System.out.println(calculateFactorial(new BigInteger("4")));

答案 1 :(得分:0)

由于阶乘仅为整数定义,因此使用整数而不是泛型会更容易。但是如果你想使用T作为练习,你需要返回一个T对象:

    T one = (T) new Integer(1);
    if (n.compareTo(0)==0)  {
        return one;
    }

您还需要定义自己的乘法和减法,因为数学运算在泛型上不可用。