elm*_*elm 2 haskell factorial lazy-evaluation
与Fibonacci系列类似的方式可以生成如下,
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
如何定义阶乘的系列.
更新
令人尴尬的是,在添加这个问题之前尝试了这个,
Prelude> let factorial = 2 : 6 : zipWith(*) factorial (tail factorial)
Prelude> take 5 factorial
[2,6,12,72,864]
Run Code Online (Sandbox Code Playgroud)
事实上,尾部的数字并不是连续的值.
让我们退后一步,记住懒惰版本的实际来源:
fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)
Run Code Online (Sandbox Code Playgroud)
我们也可以类似地定义阶乘:
factorial 0 = 1
factorial n = factorial (n - 1) * n
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我们的压缩操作实际上是(*),第二个列表不是子列表factorials,而是[x..]适当的x:
factorials = 1 : zipWith (*) factorials [x..]
Run Code Online (Sandbox Code Playgroud)
应该x是什么价值?那么,第二个元素应该是1 = 1 * 1,所以它是1自然的:
factorials = 1 : zipWith (*) factorials [1..]
Run Code Online (Sandbox Code Playgroud)
请注意,我们只需要给出第一个元素,因为我们不使用tail或类似的东西.如您所见,您的尝试几乎是正确的.您刚刚使用了左侧的错误值:
Prelude> let factorial = 2 : 6 : zipWith (*) [4..] (tail factorial)
Prelude> take 10 $ factorial
[2,6,24,120,720,5040,40320,362880,3628800,39916800]
Run Code Online (Sandbox Code Playgroud)
备注:阶乘序列是0!,1!,2!,...,所以如果你想要符合OEIS标准,请从[1,1,...].
阶乘的惰性列表的惯用定义根本不是递归的:而是使用Prelude函数scanl.
factorials = scanl (*) 1 [1..]
Run Code Online (Sandbox Code Playgroud)