2

根据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]而它应该比第一个函数提供更好的性能,因为它使用尾递归。还有其他影响递归函数的因素吗?

4

1 回答 1

10

您的第二个函数不是尾递归的,因为它被loop t acc + h解析为.(loop t acc) + h+loop

更改loop t acc + hloop t (acc + h)以使函数变为尾递归。

于 2012-04-11T12:26:03.567 回答