Нека направим крачка назад и си спомним откъде всъщност идва тази мързелива версия:
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