如何生成指数权重数组?

时间:2010-03-02 15:19:24

标签: f#

我试图做一个“展开” - (我认为),从一个初始值开始,重复应用一些函数,然后得到一个序列作为结果。

在这个例子中,我试图从1.0开始,将它乘以.80,并做4次,这样我最终得到一个数组= [| 1.0; 0.80; 0.64; 0.512 |]

VS 2010说我以无效的方式使用“i”,并且闭包不能捕获可变值 - 所以这个函数不能编译。任何人都可以建议一个真正有效的干净方法吗?谢谢。

let expSeries seed fade n = 
//take see and repeatedly multiply it by the fade factor n times...
    let mutable i = 0;
    let mutable weight = seed;
    [| while(i < n) do
          yield weight;
          weight <- weight * fade |]

let testWeights = expSeries 1.0 0.80 4

4 个答案:

答案 0 :(得分:7)

let exp_series seed fade n =  
    Array.init (n) (fun i -> seed * fade ** (float i))

答案 1 :(得分:2)

我认为这个递归版本应该可行。

let expSeries seed fade n = 
   let rec buildSeq i weight = seq {
       if i < n then
           yield weight;
           yield! buildSeq (i + 1) (weight * fade) 
   } 
   buildSeq 0 seed
   |> Seq.toArray

答案 2 :(得分:2)

根据anwer to this question,您可以创建展开,并获取其中的一些值:

let weighed startvalue factor  = 
  startvalue |> Seq.unfold (fun x -> Some (x, factor * x))

let fivevalues = weighed 1.0  .8   |> Seq.take 5

答案 3 :(得分:1)

如果您想明确使用展开,请按以下方式进行:

let expSeries seed fade n =
  Seq.unfold 
    (fun (weight,k) -> 
      if k > n then None 
      else Some(weight,(weight*fade, k+1)))
    (seed,1)
  |> Array.ofSeq

let arr = expSeries 1.0 0.80 4

请注意,原始代码无法工作的原因是闭包不能捕获可变绑定,而序列,列表和数组表达式隐式使用闭包。