在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