在F#中定义尾递归函数的累加器

时间:2016-08-11 17:51:38

标签: f# tail-recursion

我是F#的初学者,我仍然无法绕过尾递归的概念。具体来说,我不知道尾递归是如何工作的,因为既没有与累加器相关的任何值,也没有定义累加器。

以下是用于计算阶乘

的尾递归函数的示例代码
let factorial x =
// Keep track of both x and an accumulator value (acc)
    let rec tailRecursiveFactorial x acc =
        if x <= 1 then 
            acc
        else 
            tailRecursiveFactorial (x - 1) (acc * x)
    tailRecursiveFactorial x 1

我不是要求如何编写尾递归函数,也不是要求尾部和非尾部递归函数的示例。我要问的是累加器是如何工作的,因为它从未被定义

1 个答案:

答案 0 :(得分:9)

累加器在这里定义:

let rec tailRecursiveFactorial x acc =

此本地函数的类型为int -> int -> int,表示acc的类型为int

编译器推断出这一点,因为x与文本1进行比较,int类型为x,因为它是一个非限定的整数文字。这意味着int也必须属于acc * x类型。

同样,表达式x使用acc,然后编译器会推断int也必须具有serviceDomain类型。