Вы можете отобразить пары элементов между вашим списком и реверсом, затем идут слева направо через этот список пара и продолжать принимать до тех пор, как ваше условие:
val list = List(1, 2, 3, 4, 5)
val zipped = list zip list.reverse
val filtered = zipped takeWhile { case (a, b) => (a < b) }
Значение filtered
является List((1, 5), (2, 4))
. Теперь вы можете делать все, что вам нужно с этими элементами:
val result = filtered map {
case (a, b) =>
// do something with each left-right pair, e.g. sum them
a + b
}
println(result) // List(6, 6)
Если вам нужно какое-то зависит от контекста операции (то есть, каждый итерации зависит от результата предыдущего), то вы должны использования более мощная абстракция (монада), но давайте не будем туда, если вам этого достаточно. Еще лучше было бы просто использовать рекурсию, как отмечали другие, но вы сказали, что это не вариант.
EDIT:
версия без дополнительного прохода для реверсирования, только постоянное время доступ для эля (длина - индекс):
val list = List(1, 2, 3, 4, 5)
val zipped = list.view.zipWithIndex
val filtered = zipped takeWhile { case (a, index) => (a < list(list.length - 1 - index)) }
println(filtered.toList) // List((1, 0), (2, 1))
val result = filtered map {
case (elem, index) => // do something with each left-right pair, e.g. sum them
val (a, b) = (elem, list(list.length - 1 - index))
a + b
}
println(result.toList) // List(6, 6)
Вы можете использовать рекурсивный подход ... –
О, да. Благодарю. Однако я бы предпочел нерекурсивный подход. – Michael
Если вы хотите использовать цикл, вам нужно будет изменить любую переменную (по крайней мере, некоторую helpervariable), чтобы получить условие выхода. Btw. почему вы не хотите использовать рекурсию? Это функциональный способ делать вещи с неизменными ценностями! (Пожалуйста, обновите свой вопрос) –