F#将函数应用于它的结果n次

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)

我也可以使用带有计数器变量的递归,但这似乎很尴尬.我只是错过了一个简单的正确解决方案?

Nik*_*ird 6

只是想在这里跳出框框思考,而不是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)


Ric*_*ard 5

我也可以使用带有计数器变量的递归,但这似乎很尴尬.

这对我来说似乎很自然:允许一个调用的结果传递给下一个没有可变状态的调用.就像是:

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)

  • Terse版本(来自[F#News](http://fsharpnews.blogspot.com/2010/06/dragon-curve-in-17-lines-of-f.html))``let rec nest nfx = if n = 0然后x else nest(n-1)f(fx)` (3认同)