Продолжить информацию о предыдущих вычислениях

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

Допустим, у меня есть список чисел, например от 1 до 10 000, и я хочу получить элементы списка, сумма которых не превышает числа n (скажем, 100). Таким образом, он будет получать числа до тех пор, пока их сумма не станет больше 100.

В императивном программировании решить эту проблему тривиально, потому что я могу сохранять переменную в каждом взаимодействии и останавливаться, когда цель достигнута.

Но как сделать то же самое в функциональном программировании? Поскольку функция суммы работает с завершенными списками, а у меня все еще нет завершенного списка, как я могу «продолжить» вычисления?

Если бы сумма вычислялась лениво, я мог бы написать что-то вроде этого:

           (1 to 10000).sum.takeWhile(_ < 100)

PS:Хотя любой ответ будет оценен по достоинству, я бы хотел, чтобы сумма не вычислялась каждый раз, поскольку очевидно, что императивная версия будет быть гораздо более оптимальным в отношении скорости.

Редактировать:

Я знаю, что могу "преобразовать" метод императивного цикла в функциональную рекурсивную функцию. Меня больше интересует, может ли одна из существующих библиотечных функций дать мне возможность не писать ее каждый раз, когда мне что-то нужно.

6
задан Vinicius Seufitele 14 May 2012 в 12:28
поделиться