Вы могли бы
def solve(threshold: Int, i: Int = 0)(f: Int => Int) = {
if (threshold <= 0) i else solve(threshold - f(i), i+1)(f)
}
, но я не уверен, что это на самом деле яснее.Обратите внимание, что на самом деле это больше символов, чем компактная версия цикла while:
def solve(threshold: Int)(f: Int => Int) = {
var s,i = 0; while (s < threshold) { s += f(i); i += 1 }; i
}
Циклы с изменяемыми переменными не всегда плохи, «идиоматичны» или нет.Просто сохраняйте изменчивое состояние, которое безопасно содержится внутри функции, и все, что кто-либо еще видит, - это функция без сохранения состояния.
Кстати, хотя sum
- разумное имя переменной, curr
сомнительно.Что не так с i
?Он широко используется в качестве индексной переменной, и в любом случае наличие переменной вообще является неприятностью;Дело в том, что вы берете что-то и увеличиваете это, что бы это ни было, на один шаг каждый раз, а затем возвращаете это.Именно этот поток логики, а не имя, говорит вам (и другим), для чего он нужен.