На днях появилась статья [5nw][1] [Два способа быстрого вычисления факториала][2], в которой приводится идея ускорения подсчёта факториала с помощью группировки перемножаемых чисел в дерево по принципу «разделяй и властвуй». Взглянув на это, я сразу понял, что тут параллельные потоки Java проявят себя во всей красе: ведь они делят задачу на подзадачи с помощью сплитераторов именно таким образом. Получается, что быстрая реализация будет ещё и красивой:
public static BigInteger streamedParallel(int n) {
if(n < 2) return BigInteger.valueOf(1);
return IntStream.rangeClosed(2, n).parallel().mapToObj(BigInteger::valueOf).reduce(BigInteger::multiply).get();
}
[Читать дальше →][3]
[1]:
http://habrahabr.ru/users/5nw/
[2]:
http://habrahabr.ru/post/255761/
[3]:
http://habrahabr.ru/post/255813/#habracut