Haskell 中的 Fibonacci 封闭式表达式
斐波那契闭合形式代码在haskell?
How would the Fibonacci's closed form code look like in haskell?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
斐波那契闭合形式代码在haskell?
How would the Fibonacci's closed form code look like in haskell?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
以下是该公式到 Haskell 的简单翻译:
它只能给出
n = 75
以内的正确值,因为它使用Double
精度浮点运算。但是,我们可以通过使用
a + b * sqrt 5
形式的数字来避免浮点运算!让我们为它们创建一个数据类型:我们免费获得幂运算,因为它是根据
Num
方法实现的。现在,我们必须稍微重新排列公式才能使用它。这给出了准确的答案。
Daniel Fischer 指出,我们可以使用公式
phi^n = fib(n-1) + fib(n)*phi
并处理a + b * phi< 形式的数字/代码>(即ℤ[φ])。这避免了笨拙的除法步骤,并且仅使用一次求幂。这提供了一个更好的实现:
Here's a straightforward translation of the formula to Haskell:
This gives correct values only up to
n = 75
, because it usesDouble
precision floating-point arithmetic.However, we can avoid floating-point arithmetic by working with numbers of the form
a + b * sqrt 5
! Let's make a data type for them:We get exponentiation for free since it is implemented in terms of the
Num
methods. Now, we have to rearrange the formula slightly to use this.This gives an exact answer.
Daniel Fischer points out that we can use the formula
phi^n = fib(n-1) + fib(n)*phi
and work with numbers of the forma + b * phi
(i.e. ℤ[φ]). This avoids the clumsy division step, and uses only one exponentiation. This gives a much nicer implementation:在 Haskell 中给出为:
简单地说,来自 Haskell wiki 页面的 Binet公式 包括共享平方根的结果。例如:
对于任意整数,您需要在转换为浮点值时更加小心。
请注意,此时 Binet 的值与递归公式有很大不同:
您可能需要更高的精度:-)
Trivially, Binet's formula, from the Haskell wiki page is given in Haskell as:
Which includes sharing of the result of the square root. For example:
For arbitrary integers, you'll need to be a bit more careful about the conversion to floating point values.
Note that Binet's value differs from the recursive formula by quite a bit at this point:
You may need more precision :-)