我是 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
。
编译器推断出这一点是因为 x
与 1
比较,后者属于 int
类型,因为它是一个不合格的整数文字.这意味着 x
也必须是 int
类型。
同样,表达式 acc * x
使用 x
,然后编译器推断 acc
必须具有类型 int
也是如此。
关于f# - 在 F# 中定义尾递归函数的累加器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38903037/