【问题标题】:Haskell find value of converging sequenceHaskell找到收敛序列的值
【发布时间】:2017-02-21 16:48:32
【问题描述】:

对 Haskell 来说是全新的。我正在玩斐波那契数列来学习语言的基础知识,但我找不到惯用的方法来做某事。

斐波那契数列可以这样定义:

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

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

ratios = zipWith (/) (tail fibs) fibs

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

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

diffs = zipWith (-) ratios (tail ratios)

【问题讨论】:

  • 提示:zip ratios diffs 将是(ratio, derivative) 对的列表。所以你会想要find the first element 中的zip ratios diffs 的导数低于阈值。

标签: list haskell functional-programming


【解决方案1】:

一种可能性是使用list comprehensions

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

【讨论】:

    【解决方案2】:

    怎么样?通过使用另一个zip。这是基于您已有的单行:

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

    从右到左阅读,这表示:

    • zip 连同他们的继任者的比率列表
    • 如果比率之间的差异大于epsilon,则从列表中继续删除元素
    • 完成后,我们将获取列表中的第一个元素并选择两者中更精确的一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-06-17
      • 1970-01-01
      • 2013-10-03
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多