我今天在 unix 中发现了“ time”命令,并想用它来检查哈斯克尔中尾递归函数和普通递归函数的运行时差异。
我写了以下函数:
--tail recursive
fac :: (Integral a) => a -> a
fac x = fac' x 1 where
fac' 1 y = y
fac' x y = fac' (x-1) (x*y)
--normal recursive
facSlow :: (Integral a) => a -> a
facSlow 1 = 1
facSlow x = x * facSlow (x-1)
记住这些是有效的,它们仅用于这个项目,所以我没有费心检查零或负数。
但是,在为每个方法编写一个 main 方法、编译它们并使用“ time”命令运行它们时,两个方法都有相似的运行时,正常递归函数略过了尾部递归函数。这与我听到的 lisp 中的尾部递归优化相反。为什么会这样?