1

入力のコレクションを取り、出力のリストを作成するブートストラップ アルゴリズムを F# で記述しようとしています。前の要素のみを使用する必要がある場合は、 recursion を使用するのは簡単です:

let buildElement head previous =
    // do something to create new float 
    1.0

let buildList inputs =
    let rec bootstrap elements previous = 

        let addElement head tail =
            let newElement = buildElement head previous
            newElement :: bootstrap tail newElement   

        match inputs with
            | []    -> []
            | h::t  -> addElement h t
    bootstrap inputs 1.0

ただし、以前に作成した要素を使用したい場合 (たとえば、新しい値の平均を以前の値として渡したい場合)、内部関数でそれらにアクセスするにはどうすればよいでしょうか? 外側の関数でコレクションを作成し、内側の関数でそれを埋めますか? もしそうなら、私はそれを変更可能にする必要がありますか?

4

3 に答える 3

2

過去の値からの情報に基づいて新しい値を計算する必要がある場合は、基本的に現在行っていることと同じことを行います。最後の値を渡す代わりにpreviouspreviousパラメーターは過去の値のリストにすることができます。進むにつれて再計算します。

具体的な例を知らずに、より良い答えを出すのは難しいと思います。ただし、移動平均を計算したいとします。そのためには、カウントと以前のすべての値の合計が必要です。再帰を使用して直接エンコードすることも、次を使用することもできますSeq.scan

[ 1.0 .. 100.0 ] 
|> Seq.scan (fun (count, sum) elem -> count + 1, sum + elem) (0, 0.0)
|> Seq.map (fun (count, sum) -> sum / float count)
于 2012-05-31T12:49:26.723 に答える
0

平均関数の場合、部分的な合計と処理されたアイテムの数を渡して、平均を計算するために使用できます。

一般的な解決策として、前の結果のリストを引数として取り、次の結果を使用してその前に追加し、::完了したら全体を逆にすることができます。これには、関数を末尾再帰にするという追加の利点があります。

于 2012-05-31T10:44:31.103 に答える
0

以前に作成した要素を使用したい場合 (たとえば、新しい値の平均を以前の値として渡したい場合)、内部関数でそれらにアクセスするにはどうすればよいですか?

これはfoldor scan(プレフィックス フォールド) です。リストを新しい値にマッピングまたは折りたたむことと、結果に影響を与える値を蓄積することの両方を行っています。

于 2012-05-31T20:13:13.917 に答える