根据MSDN文档,在编写递归函数时,累加器参数的使用使函数尾递归,从而节省了堆栈空间。我正在使用 MSDN 网站上给出的两个示例来计算列表中所有数字的总和-
首先没有尾递归-
let rec Sum myList =
match myList with
| [] -> 0
| h::t -> h + Sum t
现在有了尾递归-
let Sumtail list =
let rec loop list acc =
match list with
| h::t -> loop t acc + h
| [] -> acc
loop list 0
并使用 input 运行这两个函数[1..100000]
。函数Sum
成功地计算了这个列表的总和,但是如果我通过了,就会给出 stackoverflow 异常,[1..1000000]
但是第二个函数Sumtail
失败了,[1..100000]
而它应该比第一个函数提供更好的性能,因为它使用尾递归。还有其他影响递归函数的因素吗?