我正在查看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(..)?
答案 0 :(得分:3)
如果在递归调用返回后没有什么可做的话,则调用 tail-recursive 。因此,最后一次调用相当于使用修改后的参数返回到功能代码的开头。
在第一个功能中,您仍然需要在结果中添加y
。