繁体   English   中英

Haskell如何评估斐波那契函数?

[英]How does Haskell evaluate the Fibonacci function?

我目前正在Haskell中查看此函数,该函数在位置n返回斐波那契数

fib :: Integer -> Integer
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

现在,它可以编译并返回正确的结果以及所有内容……但是我看不到Haskell如何评估此函数。

Haskell会不会一直寻找合适的定义,然后应用该定义直到不能再使用(例如达到基本情况)?

在这种情况下,这就是我想出的。 例如,评估fib 3

fib n = fib (n-1) + fib (n-2)
fib 3 = fib (3-1) + fib (3-2)
fib 3 = fib ((3-1)-1) + fib ((3-1)-2) + fib ((3-2)-1) + fib ((3-2)-2)
fib 3 = fib (((3-1)-1)-1) + fib (((3-1)-1)-2) +
        fib (((3-1)-2)-1) + fib (((3-1)-2)-2) + 
        fib (((3-2)-1)-1) + fib (((3-2)-1)-2) + 
        fib (((3-2)-2)-1) + fib (((3-2)-2)-2)
...

这可能永远持续下去,而没有给出实际结果。 但是,Haskell返回结果。 那我在做什么错?

定义中方程的顺序确实很重要。

那个部分

fib n = fib (n-1) + fib (n-2)

仅在前几行适用时才应用 也就是说,仅当n不为01 因此,该步骤

fib 3 = fib (3-1) + fib (3-2)
fib 3 = fib ((3-1)-1) + fib ((3-1)-2) + fib ((3-2)-1) + fib ((3-2)-2)

是错误的: fib (3-2)fib 1 = 1 ,而不是fib ((3-2)-1) + fib ((3-2)-2)

另一种查看方法如下。 整个3行定义可以等效地用case表示为

fib n = case n of
        0 -> 0
        1 -> 1
        m -> fib (m-1) + fib (m-2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM