haskell - Haskell 中的惰性加泰罗尼亚数字

标签 haskell recursion numbers catalan

我如何才能有效地生成一个无限的加泰罗尼亚数字列表?我现在的工作相当快,但在我看来应该有更好的方法。

c 1 = 1
c n = sum (zipWith (*) xs (reverse xs)) : xs
    where xs = c (n-1)

catalan = map (head . c) [1..]

我尝试使用 fix相反,但 lambda 还不够懒惰,无法终止计算:
catalan = fix (\xs -> xs ++ [zipWith (*) xs (reverse xs)])

我意识到(++)不理想

这种更好的方法存在吗?可以使该功能足够懒惰吗?我知道第 n 个有一个明确的公式,但我宁愿避免它。

最佳答案

Catalan numbers [wiki]可以归纳定义为:

C0 = 1 且 Cn+1=(4n+2)×Cn/(n+2)。

所以我们可以将其实现为:

catalan :: Integral i => [i]
catalan = xs
    where xs = 1 : zipWith f [0..] xs
          f n cn = div ((4*n+2) * cn) (n+2)

例如:
Prelude> take 10 catalan
[1,1,2,5,14,42,132,429,1430,4862]

关于haskell - Haskell 中的惰性加泰罗尼亚数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57733258/

相关文章:

java - 如何使用带有 int 参数的递归方法来返回该 int 中零位数的数量?

c - 找到将 N 减少到零的最小步数

jquery - 如何使用 jQuery 清空输入字段

haskell - Haskell 中 id 函数的类型

haskell - forkProcess有多危险?如何安全使用?

list - 对 Haskell 列表理解的工作感到困惑

haskell - Haskell 中的多项式

swift - 如何使用递归在 Swift Playground 中打印斐波那契数列

java - printf 显示同一个变量的不同值

haskell - 尝试找出除法错误消息 -Haskell