sch*_*rlt -2 math haskell functional-programming
我有一个序列数组,具有无限的迭代次数(例如[6,6,6,6,6]或[23,24,23,24]或[1、2、3、4、1、2、3、4 ])如何遍历Haskell中的每个此类列表并仅返回第一次迭代?在上述示例中:[6]; [23,24]; [1、2、3、4]
谢谢!
编辑:对不起,我不准确。列表确实是无限的。我的目标是返回给定Integer的等分序列的列表。我有一个函数返回除法器的总和。我从第一个和开始了递归调用,并构造了列表。这样就产生了像[6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 ...]的列表。
首先,我想解决这个问题,方法是使用列表的第一部分,直到第二个原始Int。但是,这让我感到震惊:更容易检查elem列表中是否存在总和。如果是,请按原样返回列表。否则,将总和追加并继续。
编辑2:产生(至少在我的定义中)无限列表的代码是以下块:
aliquot :: (Integral a) => a -> [a]
aliquot 0 = []
aliquot 1 = [1]
aliquot n = n : (aliquot $ sum $ divisors n)
divisors :: (Integral a) => a -> [a]
divisors n = filter ((0 ==) . (n `mod`)) [1 .. (n `div` 2)]
Run Code Online (Sandbox Code Playgroud)
这是不可能的。考虑以下顺序:[1,1,1,1,1,1,1...看起来这里的答案是[1],对吗?错误。该序列实际上是(x ^ 17 + 9)和((x + 1)^ 17 + 9)的最大公因子,一旦到达8424432925592592889329288197322308900672459420460792433rd元素,它就不再是全1。或考虑其他顺序:[1,1,1,1,1,1,1...。世界上最伟大的数学家不确定这个序列的答案是什么。这是Collatz序列为每个起始值所达到的最小数字,尽管我们从未发现不是1的数字,但我们仍无法实际证明所有数字都为1。