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