Возможно, что-то вроде этого:
public static BigInteger factorial(BigInteger n) {
return Stream.iterate (BigInteger.ONE, i -> i.add(BigInteger.ONE)).limit(Integer.parseInt(n.toString())).reduce(BigInteger.ONE, BigInteger::multiply);
}
РЕДАКТИРОВАТЬ: я забыл ограничить поток.Исправлено.
Конечно, было бы проще принять int
(или long
) в качестве аргумента:
public static BigInteger factorial(int n) {
return Stream.iterate (BigInteger.ONE, i -> i.add(BigInteger.ONE)).limit(n).reduce(BigInteger.ONE, BigInteger::multiply);
}
Маловероятно, что вам даже понадобитсявычислить факториал числа, большего чем Integer.MAX_VALUE
.Факториал такого числа был бы огромным, и, вероятно, для его вычисления потребовалось бы очень много времени.
РЕДАКТИРОВАТЬ: Не правильный тест, но factorial(100000)
занял у меня 5 секунд, а factorial(1000000)
занял 8 минут.В этом случае factorial(Long.MAX_VALUE)
или даже factorial(Integer.MAX_VAULE)
займет очень очень много времени.Поэтому я не вижу смысла требовать аргумент BigInteger
.