求和函数

下面是一个非尾递归函数,用于计算整数列表的总和。

let rec sum = function
  | [] -> 0
  | h::t -> h + (sum t)

该函数执行的最后一个操作是添加。因此,该函数不是尾递归的。

下面是相同函数的尾递归版本。

let sum l =
  let rec aux acc = function
    | [] -> acc
    | h::t -> aux (acc+h) t
  in
  aux 0 l

这里,aux 函数是尾递归的:它执行的最后一个操作是调用自身。因此,sum 的后一版本可以与任何长度的列表一起使用。