我尝试使用递归来实现阶乘函数。我尝试使用泛型,但无法弄清楚如何处理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)
错误。
我应该如何处理这个问题以及这样做的好习惯是什么?泛型是否应该用于此类功能?
答案 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;
}
您还需要定义自己的乘法和减法,因为数学运算在泛型上不可用。