优化F#中的nbody算法

The*_*ost 1 algorithm optimization f#

如何进一步优化此代码:

let rec nCollect func = function
        | [] -> []
        | x::xs -> let firstAndNext body (firstBody, ys) = 
                        let newFirst, z = func firstBody body
                        newFirst, z::ys
                   let y, ys = List.foldBack firstAndNext xs (x, [])
                   y::(nCollect func ys)
Run Code Online (Sandbox Code Playgroud)

此代码是nbody仿真程序的一部分.它正在获取每个正文并在它和下一个之间应用函数函数.结果用于下一次迭代.我用列表略微优化了它.问题是输入体的计数低于10,但nCollect被称为数百万次.例如,如果我在nCollect中使用尾递归,结果会更糟.

Bri*_*ian 5

我认为每种语言中90%的微优化问题的答案总是相同的:使用数组,循环和变异.

所以,我会使用数组,循环和变异,而不是List.foldBack.