Haskell找到收敛序列的值

时间:2016-10-12 18:45:05

标签: list haskell functional-programming

Haskell全新。我正在玩斐波纳契序列来学习语言的基础知识,我找不到惯用的做法。

Fibonacci序列可以这样定义:

fibs = 1 : 1 : zipWith (+) fibs (tail fibs)

(那已经很酷)。然后,我想使用序列来近似黄金比率(Phi)。所以:

ratios = zipWith (/) (tail fibs) fibs

是更好和更好的近似Phi的列表。假设我希望在列表在给定阈值epsilon下“稳定”时获得第一个值。 (即:两个连续的比率值之间的差异小于epsilon)。我可以看到我如何用命令式语言(使用索引)来做到这一点,但是如何在Haskell中这样做呢?

(我们需要使用以下列表吗?但是如何?)

diffs = zipWith (-) ratios (tail ratios)

2 个答案:

答案 0 :(得分:3)

如何?通过使用另一个zip。这是一个基于你已经拥有的单行内容:

snd . head . dropWhile (\(p1,p0) -> abs (p0 - p1) >= epsilon) $ zip ratio (tail ratio)

从右到左阅读,这说:

  • zip将比率列表与其继承人列在一起
  • 如果比率之间的差异大于epsilon ,则列表中的
  • 会继续删除元素
  • 一旦完成,我们将获取列表的第一个元素并选择更精确的两个元素。

答案 1 :(得分:3)

一种可能性是使用list comprehensions

getApprox threshold = head $ [ratio | (ratio, diff) <- zip (tail ratios) diffs
                                    , abs diff < threshold
                             ]