迭代功能不保存中间步骤?

| 我刚刚开始学习Haskell,并且作为练习进入了一个Euler项目问题​​,其中求和了斐波那契数。我当前的方法是此函数,它将使用下一个元素创建一个新列表:
fib :: (Integral a) => [a] -> [a]
fib xs@(x1:x2:_) = (x1+x2) : xs
我发现函数
iterate
在结果上重新应用了该函数。但是,结果是一个列表列表
[[2,1],[3,2,1],[5,3,2,1],..]
。当我对中间结果不感兴趣时​​,to1的替代方案是什么?我想用最后生成的数字作为条件的
takeWhile
。这是完全错误的思考方式吗? (我见过更好/更短/更聪明的斐波那契数列生成方法,所以我并不是真的在寻求有关
fib
函数的反馈-但我想使它工作,无论是否是次优的方法)     
已邀请:
只需使用
iterate
!因为Haskell是一种纯语言,所以所有子列表都可以共享,并且您几乎无需为生成所有这些迷你列表付出任何代价:
[2, 1]
实际上是
[3, 2, 1]
中的
2, 1
,依此类推。 您并不是真的想要
takeWhile
,因为那会给您带来很多额外的麻烦,您仍然需要以
last
到达列表末尾。而是使用
find
。 另请注意,如果您打算对结果列表进行求和,您会错过
1
,因此您将一口气。     
我不确定ѭ1的使用,但请参阅Haskell中的过滤斐波那契序列以了解如何过滤fib列表。 这是相同的作业吗?     
我将使用\“ take \”,因为每个连续逼近的精度将比最后一个精度高一个整数。然后,您可以对此做(head。相反)。 请注意,如果要迭代的函数没有可计算的固定点,则“每个”结果是中间结果。     
在Haskell中需要一个函数时,只需定义它即可:) 以下内容不是最优雅或惯用的Haskell,但可以说明,如果有需要,您总是可以通过尾递归循环手动完成操作
apply_n f n x =
    if n = 0 then x
    else apply_n\' f (n-1) (f x)

n_th_fib n = apply_n fib n [1,1]
我很确定有一种使用折叠的更整洁的方法(或者我忘记了的库函数:))     

要回复问题请先登录注册