在 Haskell 中,如果我写
fac n = facRec n 1
where facRec 0 acc = acc
facRec n acc = facRec (n-1) (acc*n)
并用 GHC 编译它,结果会与我使用的不同吗
fac 0 = 1
fac n = n * fac (n-1)
我可以轻松地做到fac n = product [1..n]
并避免整个事情,但我对尾递归的尝试如何在惰性语言中发挥作用很感兴趣。我知道我仍然可以得到堆栈溢出,因为 thunk 正在建立,但是当我使用累加器时,实际上发生的任何事情(就生成的编译程序而言)与我只是陈述天真的递归时不同吗?除了提高易读性之外,省略尾递归还有什么好处?如果我runhaskell
用来运行计算而不是先编译它,答案是否会发生变化?