迭代功能不保存中间步骤?
|
我刚刚开始学习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
函数的反馈-但我想使它工作,无论是否是次优的方法)
没有找到相关结果
已邀请:
4 个回复
钾涎净介
!因为Haskell是一种纯语言,所以所有子列表都可以共享,并且您几乎无需为生成所有这些迷你列表付出任何代价:
实际上是
中的
,依此类推。 您并不是真的想要
,因为那会给您带来很多额外的麻烦,您仍然需要以
到达列表末尾。而是使用
。 另请注意,如果您打算对结果列表进行求和,您会错过
,因此您将一口气。
呕蹿尉
稼悸
甲车劲
我很确定有一种使用折叠的更整洁的方法(或者我忘记了的库函数:))