Как сгенерировать массив экспоненциальных весов? - PullRequest
2 голосов
/ 02 марта 2010

Я пытаюсь сделать «развернуть» - (я думаю), начиная с начального значения, неоднократно применяя к нему некоторую функцию, а затем получая последовательность в результате.

В этом примере я пытаюсь начать с 1,0, умножить его на 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 ]

7 голосов
/ 02 марта 2010
let exp_series seed fade n =  
    Array.init (n) (fun i -> seed * fade ** (float i))
2 голосов
/ 02 марта 2010

Исходя из ответа на этот вопрос , вы можете создать развёртывание и принять несколько значений:

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

let fivevalues = weighed 1.0  .8   |> Seq.take 5
2 голосов
/ 02 марта 2010

Я думаю, что эта рекурсивная версия должна работать.

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
1 голос
/ 02 марта 2010

Если вы хотите явно использовать развертывание, вот как:

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

Обратите внимание, что причина, по которой исходный код не работает, в том, что изменяемые привязки не могут быть захвачены замыканиями, а выражения последовательности, списка и массива неявно используют замыкания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...