Я написал ответ на первый вопрос Project Euler:
Добавьте все натуральные числа ниже тысячи, кратные 3 или 5.
Первое, что пришло ко мне, было:
(1 until 1000).filter(i => (i % 3 == 0 || i % 5 == 0)).foldLeft(0)(_ + _)
но он медленный (он принимает 125 мс), поэтому я переписал его, просто думая о "другом пути" по сравнению с "более быстрым способом"
(1 until 1000).foldLeft(0){
(total, x) =>
x match {
case i if (i % 3 == 0 || i % 5 ==0) => i + total // Add
case _ => total //skip
}
}
Это намного быстрее (всего 2 мс). Зачем? Я предполагаю, что вторая версия использует только генератор Range и никак не отображает полностью реализованную коллекцию, делая все за один проход, как быстрее, так и с меньшим объемом памяти. Я прав?
Здесь код на IdeOne: http://ideone.com/GbKlP