我在Java 8和lambda表达式以及Stream
中相对较新,我可以使用for
循环或递归计算阶乘。但有没有办法使用IntStream
来计算数字的阶乘?即使在整数范围内使用阶乘也很好。
我在这里阅读了IntStream
个文档http://docs.oracle.com/javase/8/docs/api/java/util/stream/IntStream.html,我可以看到很多方法,但不确定哪个方法可以用来计算因子。
例如,有rang
方法,
range(int startInclusive,int endExclusive)返回一个顺序 从startInclusive(包括)到endExclusive的有序IntStream (不包括)增量步骤1.
所以我可以用它来提供IntStream的数字范围来乘以计算阶乘。
number = 5;
IntStream.range(1, number)
但如何将这些数字相乘得到阶乘?
答案 0 :(得分:11)
您可以使用IntStream::reduce完成此项工作,
int number = 5;
IntStream.rangeClosed(2, number).reduce(1, (x, y) -> x * y)
答案 1 :(得分:1)
要获得所有无限阶乘的流,您可以执行以下操作:
class Pair{
final int num;
final int value;
Pair(int num, int value) {
this.num = num;
this.value = value;
}
}
Stream<Pair> allFactorials = Stream.iterate(new Pair(1,1),
x -> new Pair(x.num+1, x.value * (x.num+1)));
allFactorials
是一个从1到1的阶乘的阶乘流。要得到1到10的阶乘:
allFactorials.limit(10).forEach(x -> System.out.print(x.value+", "));
它打印: 1,2,6,24,120,720,5040,40320,362880,3628800,
现在说你只希望得到一个特定数字的阶乘:
allFactorials.limit(number).reduce((previous, current) -> current).get()
最好的部分是你不再为新数字重新计算,而是以历史为基础。
答案 2 :(得分:1)
使用LongStream.range(),您可以计算20的数字因子。如果需要使用BigInteger计算更大数量的创建流:
public BigInteger factorial(int number) {
if (number < 20) {
return BigInteger.valueOf(
LongStream.range(1, number + 1).reduce((previous, current) -> previous * current).getAsLong()
);
} else {
BigInteger result = factorial(19);
return result.multiply(Stream.iterate(BigInteger.valueOf(20), i -> i.add(BigInteger.ONE)).limit(number - 19)
.reduce((previous, current) -> previous.multiply(current)).get()
);
}
}
答案 3 :(得分:0)
我认为我们可以将主要条件更改为: 1,v v-1,s t具有减少功能。 也许我们可以在执行主要规则之前进行过滤