为什么不是这个F#代码尾巴

我正在查看Visual Studio 2015提供的F#'Tutorial'模板中的代码,我看到了这段代码; 我想知道为什么第一个函数不是尾递归的; 我想我明白但是想确认一下:

/// Computes the sum of a list of integers using recursion.
let rec sumList xs =
    match xs with
    | []    -> 0
    | y::ys -> y + sumList ys

/// Make the function tail recursive, using a helper function with a result accumulator
let rec private sumListTailRecHelper accumulator xs =
    match xs with
    | []    -> accumulator
    | y::ys -> sumListTailRecHelper (accumulator+y) ys

第一个不是尾递归,因为'+'是一个函数,它的'两个参数是先评估的? 因此,评估的实际顺序是:y,然后sumList ys,然后+? 而在第二种情况下,评估的顺序是:accumulator,y,+ then sumListTailRecHelper(..)?


如果在递归调用返回后没有什么可做,则调用是尾递归的。 所以最后的调用等于返回到功能代码的开始处,并具有修改的参数。

在第一个函数中,您仍然必须将y添加到结果中。

链接地址: http://www.djcxy.com/p/14145.html

上一篇: Why isn't this F# code tail

下一篇: how to make these simple functions tail recursive in f#