Давайте сделаем шаг назад и вспомним, откуда на самом деле взялась эта ленивая версия:
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Точно так же мы можем определить факториал:
factorial 0 = 1
factorial n = factorial (n - 1) * n
Как видите, наша операция архивирования на самом деле (*)
, и второй список будет не подсписком factorials
, а [x..]
с соответствующим x
:
factorials = 1 : zipWith (*) factorials [x..]
Какое значение должно быть x
? Ну, второй элемент должен быть 1 = 1 * 1
, так что это 1
, естественно:
factorials = 1 : zipWith (*) factorials [1..]
Обратите внимание, что нам нужно указать только первый элемент, поскольку мы не используем tail
или что-то подобное. Как видите, ваша попытка была почти правильной. Вы просто использовали неправильные значения для левой стороны:
Prelude> let factorial = 2 : 6 : zipWith (*) [4..] (tail factorial)
Prelude> take 10 $ factorial
[2,6,24,120,720,5040,40320,362880,3628800,39916800]
Примечание. Факторная последовательность 0!, 1!, 2!, ..., поэтому, если вы хотите быть совместимым с OEIS, начните с [1,1,...]
.
person
Zeta
schedule
22.10.2014
factorials = <gap> : <gap> : zipWith (*) <gap> (tail factorials)
. Заполнить пробелы. - person Zeta   schedule 22.10.2014