在Haskell,如果我写蓄电池在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
来运行计算而不是首先编译它,那么答案是否会改变?
你对“确实发生了什么不同”的定义是什么?微不足道的答案是“是”,因为它们是不同的 - 一个是尾递归,另一个不是。但我不认为这就是你要求的..? – lijie 2010-11-26 05:29:25
您是不是指facRec n acc = facRec(n-1)(acc * n)? – 2010-11-26 10:38:42
@lijie - 我主要感兴趣的是GHC是否会调用优化(有或没有累加器),但是我把它留给了一般,因为我老实说不确定尾递归如何与懒惰语言交互,并且可能会做其他不同基于我使用一种形式与另一种形式的东西。我不知道其他的东西是什么。 – Inaimathi 2010-11-26 12:23:20