Я попытаюсь реализовать решение, не заполняя пробелы, но предложив другой подход.
def fsolve(n: Int): Double = {
require(n > 0, "n must be positive")
def f(n: Int): Long = (1 to n).fold(1)(_ * _)
(1.0 / f(n)) * ((1 to n).map(f).sum)
}
В функции, которую я проверяю, происходит сбой при неверном вводе с require
, я определяюфакториал (как f
), а затем используйте его, просто записав функцию как можно ближе к исходному выражению, которое мы хотели реализовать:
(1.0 / f(n)) * ((1 to n).map(f).sum)
Если вы действительно хотите явно сложить, вы можете переписатьэто выражение выглядит следующим образом:
(1.0 / f(n)) * ((1 to n).map(f).fold(0L)(_ + _))
Также обратите внимание, что, поскольку все выполняемые вами операции (суммы и умножения) являются коммутативными, вы можете использовать fold
вместо foldLeft
: использование первого не делает 't предписывает порядок, в котором должна выполняться операция, позволяя конкретной реализации коллекции выполнять вычисления параллельно.
Вы можете поиграться с этим кодом здесь, в Scastie .