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

标签 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

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

最佳答案

累加器在这里定义:

let rec tailRecursiveFactorial x acc =

这个本地函数的类型是 int -> int -> int,这意味着 acc 的类型是 int

编译器推断出这一点是因为 x1 比较,后者属于 int 类型,因为它是一个不合格的整数文字.这意味着 x 也必须是 int 类型。

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

关于f# - 在 F# 中定义尾递归函数的累加器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903037/

相关文章:

linux - How to compile c sharp console application in linux with multiple modules (how to define order of fs files?)

c# - C# 中的 Agent/MailboxProcessor 使用新的 async/await

f# - F# 中内插字符串中的嵌入字符串

erlang - 尾递归与非尾递归。前者慢吗?

algorithm - 使用尾递归的后序

javascript - 为什么这个尾调用优化函数失败并出现最大调用堆栈大小超出错误?

c++ - 递归函数是否有部分尾调用优化?

f# - 无法引用 F# 类库

visual-studio - 为什么我不能让 Suave 在 VS 2017 上工作?

c++ - clang无限尾递归优化