我想知道 oCaml 是否将此代码优化为尾递归,如果是,F# 是否如此?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
我想知道 oCaml 是否将此代码优化为尾递归,如果是,F# 是否如此?
let rec sum xs =
match xs with
| [] -> 0
| x :: xs' -> x + sum xs'
在递归情况下(即 xs 不为空的情况),最后计算的操作是加法。对于尾递归函数,最后评估的操作需要是对 sum 的递归调用。
像这样的函数通常使用带有累加器的辅助函数来定义,以使它们尾递归。在这种情况下,这将是一个函数,它接受要求和的列表和总和的当前值。如果列表为空,它将返回总和的当前值。如果列表不为空,它将以列表的尾部和总和的当前值 + 列表的头部作为参数调用自身。然后 sum 函数将简单地使用列表和 0 作为 sum 的当前值调用辅助函数。
不,这段代码不是尾递归的,ocaml 不会转换它。你必须自己做。
我不知道 F#,但我怀疑它会优化这个。