从Haskell中的列表返回序列的第一次迭代

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)

Jos*_*ica 6

这是不可能的。考虑以下顺序:[1,1,1,1,1,1,1...看起来这里的答案是[1],对吗?错误。该序列实际上是(x ^ 17 + 9)和((x + 1)^ 17 + 9)的最大公因子,一旦到达8424432925592592889329288197322308900672459420460792433rd元素,它就不再是全1。或考虑其他顺序:[1,1,1,1,1,1,1...。世界上最伟大的数学家不确定这个序列的答案是什么。这是Collat​​z序列为每个起始值所达到的最小数字,尽管我们从未发现不是1的数字,但我们仍无法实际证明所有数字都为1。

  • @nm来自问题:“无限迭代” (5认同)
  • 在作业中可能规定,一旦再次看到以前看到的元素之一,我们就可以假定已检测到该循环。即,这可能是对输入数字的限制。 (2认同)
  • 也可能是OP没有正确使用“无限”一词。也许正确的词是“无限”。我不知道,也许OP可以发出声音并回答我在评论中提出的问题。否则,这是徒劳的。从目前的角度来看,这个问题涵盖了两个截然不同的问题,一个是琐碎的(如何在列表中映射),另一个是个琐碎的(如何从(有限的)周期序列中提取一个周期)。在入门课程中,此类问题通常不会出现在作业中。也许OP将其误写为SO。 (2认同)
  • @schoeberlt拥抱在过去10年左右已过时。 (2认同)