求阶乘,一定会想到循环和递归,但是结果大了之后就要考虑数据类型,int或long存不下最后阶乘的结果。
版本1循环
private static int factorial(int n) {
if (n <0) return -1;
int result=1;
for(int i=1;i<=n;i++) {
result*=i;
}
return result;
}
这种循环适合比较小的阶乘。
版本2递归
public static int factorial1(int n) {
if (n <0) {
return -1;
}else if (n <= 1) {
return 1;
}else {
return n * factorial1(n - 1);
}
}
版本3循环
private static BigInteger factorial3(int n) {
BigInteger result=new BigInteger("1");
if (n <0) {
return BigInteger.valueOf(-1);
}else {
for(int i=1;i<=n;i++) {
result=result.multiply(new BigInteger(String.valueOf(i)));
}
return result;
}
}
BigInteger的定义和普通数据类型不太一样,乘法也不太一样,而且只能BigInteger类型跟BigInteger类型相乘,所以在循环时把i通过构造方法变成BigInteger类型,而构造方法又需要是String类型,所以又把i变成String。
版本4递归
public static BigInteger factorial2(int n) {
if (n <0) {
return BigInteger.valueOf(-1);
}else if(n == 1 || n==0){
return BigInteger.valueOf(1);
}else{
return BigInteger.valueOf(n).multiply(factorial2(n - 1));
}
}
版本3和版本4可以算200的阶乘。