hoo*_*zis 3 f# functional-programming
我试图为以下代码找到一个功能正确的方法:
let mutable u = initialize cities pms
for i in 0 .. 10 do
u <- randomIteration u pms distances
Run Code Online (Sandbox Code Playgroud)
randomIteration是一个简单的函数,它接受一个带有2个参数的数组并返回一个修改过的数组.这个过程必须重复n次(这里10).
我提出了一个使用折叠的解决方案,但我正在创建一个"虚拟"序列,只是为了能够折叠它,这似乎不对.
let result = Seq.init 10 (fun i -> i) |> Seq.fold (fun uNext i -> randomIteration uNext pms distances) u
Run Code Online (Sandbox Code Playgroud)
我也可以使用带有计数器变量的递归,但这似乎很尴尬.我只是错过了一个简单的正确解决方案?
只是想在这里跳出框框思考,而不是randomIteration每次都使用不同的参数进行折叠,您可以创建一个 N 个randomIteration调用链并调用此链一次:
let repeat n =
Seq.init n (fun _ u -> randomIteration u pms distances)
|> Seq.reduce (>>)
initialize cities pms
|> repeat 10
|> printfn "Result: %A"
Run Code Online (Sandbox Code Playgroud)
我也可以使用带有计数器变量的递归,但这似乎很尴尬.
这对我来说似乎很自然:允许一个调用的结果传递给下一个没有可变状态的调用.就像是:
let interateSelf func initial count =
let inner intermediate n =
if n = 1 then
func intermediate
else
inner (func intermediate) (n - 1)
inner initial count
Run Code Online (Sandbox Code Playgroud)