为什么这个F#代码没有尾递归?

时间:2015-08-04 12:33:53

标签: recursion f# tail-recursion

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

/// 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,然后是+?而在第二种情况下,评估的顺序是:累加器,y,+然后sumListTailRecHelper(..)?

1 个答案:

答案 0 :(得分:3)

如果在递归调用返回后没有什么可做的话,则调用 tail-recursive 。因此,最后一次调用相当于使用修改后的参数返回到功能代码的开头。

在第一个功能中,您仍然需要在结果中添加y