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,则从列表中继续删除元素
完成后,我们将选择列表中的第一个元素,并从中选择更精确的一个。

10-07 15:14