Форум сайта python.su
Помогите решатиь задачу:
Питонтьютор, Занятие 4. Цикл for
Задача «Сумма факториалов» http://pythontutor.ru/lessons/for_loop/problems/sum_of_factorials/
Условие:
По данному натуральном nn вычислите сумму 1!+2!+3!+…+n!. В решении этой задачи можно использовать только один цикл. Пользоваться математической библиотекой math в этой задаче запрещено.
———————-
Не могу решить. Предполагаю, что нужно как-то использовать такую таблицу:
1
1х2
1х2х3
1х2х3х4
Т.е. если n = 4, то 1 умножается 4 раза, 2 три раза, и тд. Но как оформить, не знаю.
Офлайн
Заведите две переменные: одну, которая будет накапливать сумму; а другую, которая будет вычислять текущее (в цикле) значение факториала; это текущее значение прибавляйте к первой переменной (увеличивайте ее каждый раз на это значение); цикл закончится, результат будет в первой переменной.
====
Здесь букв больше, чем в коде, если бы я сразу его выписал.
Можно написать решение этой задачи в одну строку (у меня вышло 76 символов с учетом pep8), однако без учета особенностей (факториал 1)
Офлайн
Омг, спасибо, так просто оказалось) в 7 строк.
Офлайн
Вот вариант в одну строку,
f_sum = lambda n: 1 + sum((reduce(lambda x, y : x * y, range(1, i + 1)) for i in range(2, n +1)))
Отредактировано scidam (Апрель 14, 2017 04:04:37)
Офлайн
Спасибо! На будущее пригодится, пока что лямбду и все остальное не знаю…
Офлайн
А вот решение этой простенькой задачи на haskell-е. Но это только для того чтобы было с чем сравнивать…
Prelude> let fsum n = sum [product [1..x] | x <- [1..n]] Prelude> fsum 10 4037913
Отредактировано Rodegast (Апрель 18, 2017 16:57:38)
Офлайн
Это на Erlang'е
Eshell V5.10.4 (abort with ^G)
1> Fact = fun (X) -> lists:foldl(fun erlang:'*'/2, 1, lists:seq(1, X)) end.
#Fun<erl_eval.6.80484245>
2> FactSummer = fun (N) -> lists:sum(lists:map(Fact, lists:seq(1, N))) end.
#Fun<erl_eval.6.80484245>
3> FactSummer(10).
4037913
4>
>>> import math >>> >>> def fact_summer(n): ... return sum(map(math.factorial, range(1, n + 1))) ... >>> fact_summer(10) 4037913 >>>
Отредактировано py.user.next (Апрель 19, 2017 02:08:37)
Офлайн
> Это на Erlang'е
Erlang разочаровывает.
> А на питоне
>> Пользоваться математической библиотекой math в этой задаче запрещено.
На haskell-е всё равно короче.
Офлайн
Rodegast
И ужаснее, если честно. Хотя дело привычки.
Офлайн
> И ужаснее, если честно. Хотя дело привычки.
Да ладно. То что я написал полностью аналогично питоновскому варианту от scidam-а.
Офлайн