为什么这个 F# 代码不是尾递归的?
Why isn't this F# code tail-recursive?
我正在查看 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,+ 然后是 sumListTailRecHelper(..)?
如果在递归调用 returns 之后无事可做,则调用是 尾递归 。因此,最后一次调用相当于返回到函数代码的开头,并修改了参数。
在第一个函数中,您仍然需要将 y
添加到结果中。
我正在查看 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,+ 然后是 sumListTailRecHelper(..)?
如果在递归调用 returns 之后无事可做,则调用是 尾递归 。因此,最后一次调用相当于返回到函数代码的开头,并修改了参数。
在第一个函数中,您仍然需要将 y
添加到结果中。