9

我想知道 oCaml 是否将此代码优化为尾递归,如果是,F# 是否如此?

let rec sum xs =
  match xs with
    | [] -> 0
    | x :: xs' -> x + sum xs'
4

2 回答 2

13

在递归情况下(即 xs 不为空的情况),最后计算的操作是加法。对于尾递归函数,最后评估的操作需要是对 sum 的递归调用。

像这样的函数通常使用带有累加器的辅助函数来定义,以使它们尾递归。在这种情况下,这将是一个函数,它接受要求和的列表和总和的当前值。如果列表为空,它将返回总和的当前值。如果列表不为空,它将以列表的尾部和总和的当前值 + 列表的头部作为参数调用自身。然后 sum 函数将简单地使用列表和 0 作为 sum 的当前值调用辅助函数。

于 2010-02-27T13:22:19.610 回答
5

不,这段代码不是尾递归的,ocaml 不会转换它。你必须自己做。

我不知道 F#,但我怀疑它会优化这个。

于 2010-02-27T13:08:03.100 回答