как мне умножить диапазон длинного типа на лямбда-выражение - PullRequest
2 голосов
/ 19 июня 2020

как написать лямбда-выражение, которое принимает два длинных аргумента в качестве границ диапазона и возвращает умножение всех чисел в этом диапазоне

val lambda: (Long, Long) -> Long = { x, y -> for (i in x..y) {x * y}//I don't know what to fix in this block }

1 Ответ

3 голосов
/ 19 июня 2020

Вы можете использовать функцию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...