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

Cle*_*ker 2 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
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ann 9

累加器在这里定义:

let rec tailRecursiveFactorial x acc =
Run Code Online (Sandbox Code Playgroud)

这个本地函数有类型int -> int -> int,这意味着它acc有类型int.

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

同样,表达式acc * x使用x,然后编译器推断出acc必须具有类型int.

  • @ClementDecker在最终表达式中为值赋予文字"1":`tailRecursiveFactorial x 1`. (6认同)