根據MSDN文檔,在編寫遞歸函數時,使用累加器參數會使函數尾遞歸,從而節省堆棧空間。 我使用MSDN網站給出了兩個例子在列表 -爲什麼tail遞歸函數對於正常遞歸函數成功執行的輸入失敗?
第一無尾計算所有數字的總和recursion-
let rec Sum myList =
match myList with
| [] -> 0
| h::t -> h + Sum t
現在用尾巴recursion-
let Sumtail list =
let rec loop list acc =
match list with
| h::t -> loop t acc + h
| [] -> acc
loop list 0
並使用輸入[1..100000]
運行這兩個函數。 函數Sum
成功地計算了此列表的總數,但給出了stackoverflow例外,如果我通過[1..1000000]
,但第二個函數Sumtail
未能在[1..100000]
,同時它應該提供更好的性能,因爲它使用尾遞歸的第一個函數。 是否還有其他影響遞歸函數的因素?
我相信你誤解了某些東西 - 使用累加器參數不會產生函數尾遞歸。累加器參數是一種用於在使用尾遞歸函數時累加值的技術。這是一種通常會產生尾遞歸的技術,但它沒有定義尾遞歸。 – 2012-04-11 13:30:01