为什么这样的斐波那契尾调用比Haskell中纯树递归运行得快?]

问题描述 投票:2回答:1

我试图理解尾调用递归。我转换纯树递归斐波那契函数:

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

至尾声版本:

fib' 0 a = a
fib' 1 a = 1 + a
fib' n a = fib' (n-1) (fib' (n-2) a)

[当我尝试这两个版本时,即使我尝试在第二个版本中使用seq强制严格评估,第二个版本似乎也比第一个树速快!

Haskell如何处理GHC内部的此类尾部呼叫?谢谢!

我试图理解尾调用递归。我将纯树递归fibonacci函数转换为:fib 0 = 0 fib 1 = 1 fib n = fib(n-1)+ fib(n-2)到尾部调用版本:fib'0 a = a fib'1 a = 1 + ...

haskell recursion programming-languages fibonacci tail-call-optimization
1个回答
0
投票

在GHCi交互式提示符下测试的代码性能可能会产生误导,因此在对GHC代码进行基准测试时,最好在使用ghc -O2编译的独立可执行文件中对其进行测试。添加显式类型签名并确保-Wall不报告有关“默认”类型的任何警告也是有帮助的。否则,GHC可能会选择您不需要的默认数字类型。最后,使用criterion基准测试库也是一个好主意,因为它可以很好地产生可靠且可重现的时序结果。

© www.soinside.com 2019 - 2024. All rights reserved.