我正在阅读Real-World Functional Programming这本书,在尝试阅读本书的示例之前,我尝试提出自己的尾递归示例( list 10.2,第265页)。这本书的例子行之有效。我的导致堆栈溢出。

我发现如果我使用元组参数或预先计算a + accum,那么我的就可以工作。我想知道为什么。

let rnd = new System.Random()
let test2 = List.init 1000000 (fun _ -> rnd.Next(-50, 51))

let rec sum2 list accum =
  match list with
  | [] -> accum
  | a::b -> sum2 b a + accum

let result = sum2 test2 0

printfn "%d" result

最佳答案

sum2 b a + accum

请注意,这被解析为(sum2 b a) + accum,而不是sum2 b (a + accum)

因此,这称为sum2 b a。然后,它将获取该调用的结果,并向其添加accum。因此,最后计算的表达式是加法,而不是对sum2的调用。因此,对sum2的调用不是尾部调用。

关于recursion - 为什么不尾递归?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9278191/

10-16 23:53