Найти - Пользователи
Полная версия: Задача на сумму факториалов
Начало » Центр помощи » Задача на сумму факториалов
1 2 3 4
Firely
Помогите решатиь задачу:

Питонтьютор, Занятие 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 три раза, и тд. Но как оформить, не знаю.
scidam
Заведите две переменные: одну, которая будет накапливать сумму; а другую, которая будет вычислять текущее (в цикле) значение факториала; это текущее значение прибавляйте к первой переменной (увеличивайте ее каждый раз на это значение); цикл закончится, результат будет в первой переменной.
====
Здесь букв больше, чем в коде, если бы я сразу его выписал.

Можно написать решение этой задачи в одну строку (у меня вышло 76 символов с учетом pep8), однако без учета особенностей (факториал 1)
Firely
Омг, спасибо, так просто оказалось) в 7 строк.
scidam
Вот вариант в одну строку,

 f_sum = lambda n: 1 + sum((reduce(lambda x, y : x * y, range(1, i + 1)) for i in range(2, n +1)))

далее, просто, f_sum(10) и получим 1!+…+ 10!.
Однако работать будет в Python2, для Python3 reduce нужно импортировать из functools


Firely
Спасибо! На будущее пригодится, пока что лямбду и все остальное не знаю…
Rodegast
А вот решение этой простенькой задачи на haskell-е. Но это только для того чтобы было с чем сравнивать…
 Prelude> let fsum n = sum [product [1..x] | x <- [1..n]]
Prelude> fsum 10
4037913
py.user.next
Это на 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
>>>

Лямбду мы не делаем потому, что отладчик потом не видит её имя (так как у неё нет имени).
Rodegast
> Это на Erlang'е
Erlang разочаровывает.

> А на питоне
>> Пользоваться математической библиотекой math в этой задаче запрещено.

На haskell-е всё равно короче.
4kpt_V
Rodegast
И ужаснее, если честно. Хотя дело привычки.
Rodegast
> И ужаснее, если честно. Хотя дело привычки.

Да ладно. То что я написал полностью аналогично питоновскому варианту от scidam-а.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB