Я работаю над книгой Real -World Functional Programming , и я попытался придумать свой собственный пример хвостовой рекурсии, прежде чем читать пример книги (, листинг 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