我正在阅读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/