algorithm - 在 Haskell 中将不寻常的序列实现为无限列表

标签 algorithm haskell sequence lazy-sequences

我有两个元素作为列表的开头 [1, 2]

这个不寻常的序列是它复制了三个元素后面的某种类型的位数中的数字。例如,在 1 和 2 之后,我们会有另一个 2,然后是两个 1。 所需列表的前几个元素将产生

[1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2] 因为

1  2   2  1 1   2  1  2   2  1   2   2

其中前面的数字代表相同数字的迷你序列的长度。

到目前为止,我已尝试使用 replicate 函数根据列表中较早的元素重复相同的数字。

selfrle :: [Int]
selfrle = 1 : 2 : [x | a <- [0..], let x = replicate (selfrle !! a) (selfrle !! (a + 1))) ]

问题是我不明白为什么它不起作用。

最佳答案

并不像 OEIS 中的 https://oeis.org/A000002 那样不寻常并在那里被命名为 Kolakoski 序列。在那里,他们甚至提供了 John Tromp 于 2011 年编写的 Haskell 程序:

a = 1:2: drop 2 (concat . zipWith replicate a . cycle $ [1, 2])

关于algorithm - 在 Haskell 中将不寻常的序列实现为无限列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295842/

相关文章:

algorithm - 有向图节点邻居

python-3.x - python中多个AGV的最短路径算法

string - 如何在 Haskell 中分割字符串?

haskell - Applicative 的制作实例

c - GHC/FFI : calling haskell module which imports haskell libraries from C

python - 如何在 Python 中将列表项分组为顺序元组?

.net - 如何在 .NET 中的较大集合中定位一系列值(特别是字节)

sequence - 使用 sparql 获取项目在 rdf 类型序列中的位置

algorithm - 反转真值表生成 bool 语句?

algorithm - 2变量非线性搜索算法