В упражнении по программированию сначала было предложено запрограммировать факториальную функцию, а затем вычислить сумму: 1! + 2! + 3! +... n!
в O(n)
умножениях (поэтому мы не можем напрямую использовать факториал). Я не ищу решение этой конкретной (тривиальной) проблемы, я пытаюсь изучить возможности Haskell, и эта проблема - игрушка, с которой я бы хотел играть.
Я думал, что генераторы Python могут быть хорошим решением этой проблемы. Например:
from itertools import islice
def ifact():
i , f = 1, 1
yield 1
while True:
f *= i
i += 1
yield f
def sum_fact(n):
return sum(islice(ifact(),5))
Затем я попытался выяснить, было ли что-то в Haskell с аналогичным поведением, чем этот генератор, и я думал, что лень делает весь персонал без какой-либо дополнительной концепции.
Например, мы могли бы заменить myact на Python
fact = scan1 (*) [1..]
И затем решите упражнение со следующим:
sum n = foldl1 (+) (take n fact)
Интересно, действительно ли это решение эквивалентно Python относительно временной сложности и использования памяти. Я бы сказал, что решение Haskell никогда не хранит весь список, поскольку их элементы используются только один раз.
Я прав или совершенно неправ?
ИЗМЕНИТЬ: Я должен уточнить:
Prelude> foldl1 (+) (take 4 fact)
33
Prelude> :sprint fact
fact = 1 : 2 : 6 : 24 : _
Итак (моя реализация) Haskell сохраняет результат, даже если он больше не используется.