Вы можете использовать функцию reduce , она выполняет операцию за O (n-1):
val lambda: (Long, Long) -> Long = { x, y -> (x..y).reduce { a, b -> a*b } }
Но, к сожалению, это вызовет исключение, если - это 0 элемент или 1 элемент в коллекции, поэтому я бы предложил использовать функцию сворачивания, это займет еще одну итерацию, т.е. O (n):
val lambda: (Long, Long) -> Long = { x, y -> (x..y).fold(1) { a, b -> a*b } }
Это должно и будет throw для элементов, переданных как lambda(3L, 1L)
, потому что не было элементов вместо 1.