使用Java 8 IntStream计算阶乘?

时间:2015-02-12 18:00:15

标签: java java-8

我在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)

但如何将这些数字相乘得到阶乘?

4 个答案:

答案 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具有减少功能。 也许我们可以在执行主要规则之前进行过滤