Haskell的全新产品。我正在玩斐波那契序列来学习该语言的基础知识,但我找不到惯用的方法来做某事。
斐波那契数列可以这样定义:
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
(已经很酷了)。然后,我想使用该序列来近似黄金分割率(Phi)。因此:
ratios = zipWith (/) (tail fibs) fibs
是Phi越来越好的近似列表。假设我要在列表在给定的阈值epsilon下“稳定”下来时获得第一个值。 (即:比率的两个连续值之间的差小于ε)。我可以看到如何用命令式语言(使用索引)来做到这一点,但是在Haskell中如何习惯性地做到这一点呢?
(我们是否需要使用以下列表?但是如何使用?)
diffs = zipWith (-) ratios (tail ratios)
最佳答案
怎么样?通过使用另一个zip
。这是根据您已有的单线:
snd . head . dropWhile (\(p1,p0) -> abs (p0 - p1) >= epsilon) $ zip ratio (tail ratio)
从右到左阅读,它说:
zip
比率列表及其后继如果比率之间的差异大于
epsilon
,则从列表中继续删除元素完成后,我们将选择列表中的第一个元素,并从中选择更精确的一个。