Давайте сделаем шаг назад и вспомним, откуда эта ленивая версия:
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,...]
.
Что вы пытались? SO не является сервисом для решения упражнений, но мы можем подтолкнуть вас в правильном направлении, если вы продемонстрируете некоторые усилия. – chi
'factorials =: : zipWith (*) (tail factorials)'. Заполнить пробелы. –
Zeta
@chi, полностью согласен; обратите внимание на обновление с неудовлетворительной (неловкой) попыткой, прежде чем формулировать этот вопрос. – elm