gpt4 book ai didi

haskell - Haskell 中的无限惰性阶乘

转载 作者:行者123 更新时间:2023-12-02 10:56:32 27 4
gpt4 key购买 nike

以与斐波那契数列类似的方式可以如下生成,

fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

如何定义阶乘系列。

更新

令人尴尬的是,在添加这个问题之前就尝试过这个,

Prelude> let factorial = 2 : 6 : zipWith(*) factorial (tail factorial)
Prelude> take 5 factorial
[2,6,12,72,864]

事实上,从一开始,尾部的数字就不是连续的值。

最佳答案

让我们退后一步,记住这个懒惰版本实际上来自哪里:

fib 0 = 1
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

我们也可以类似地定义阶乘:

factorial 0 = 1
factorial n = factorial (n - 1) * n

如你所见,我们的压缩操作实际上是(*),第二个列表不会是阶乘的子列表,而是[ 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,...] 开始。

关于haskell - Haskell 中的无限惰性阶乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26507370/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com