3

数の倍数であるリストを作成したい。たとえば、[2; 4; 6; 8; 10] は、0 から 10 までの 2 の倍数になります。

このような x の倍数のリストを動的に作成するにはどうすればよいでしょうか? 上限を設定せずにそれを行うことは可能ですか?

それを行う 1 つの方法は、0 と非常に大きな数の間のリストを作成し、mod 関数を使用してそれをフィルタリングすることです。これをテストしようとして、0から非常に大きな数のリストを作成すると、メモリ不足の例外が発生しました(30秒ほど待機した後)。

F# には、このようなリストを作成するための非常にシンプルで素晴らしい方法があるように感じますが、それが何であるかを知るには初心者すぎます。ヘルプ?

4

4 に答える 4

3

これにより、倍数の無限のシーケンスが生成されます。

let multiples n = Seq.unfold (fun i -> Some(i, i + n)) n

multiples 3 |> Seq.take 3 //seq [3; 6; 9]

これはもう少しコードですが、より高速です。

let multiples n =
  let rec loop i =
    seq {
      yield i
      yield! loop (i + n)
    }
  loop n

これは基本的に次のC#と同等です。

static IEnumerable<int> Multiples(int n) {
    int i = n;
    while (true) {
        yield return i;
        i += n;
    }
}
于 2011-09-29T18:46:26.013 に答える
3

シーケンス (IEnumerables) は、ここで必要な遅延を提供します。

let multiplesOfN n =
    seq {
        for i in 1 .. 1000000 do
            yield i * n
    }

let first6multsof3 = 
    multiplesOfN 3 |> Seq.take 6

printfn "%A" (first6multsof3 |> Seq.toList)

またはあなたのfilter-mod戦略で:

seq { 1 .. 1000000} |> Seq.filter (fun x -> x%3=0) |> Seq.take 6 |> Seq.toList 
于 2011-09-29T18:41:43.350 に答える
2
[ firstValue..Step..endValue]

[ 2..2..10] => [2; 4; 6; 8; 10]

他の方法

Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))
于 2011-09-29T21:52:31.513 に答える
1
List.init 10 ((*) 3)
val it : int list = [0; 3; 6; 9; 12; 15; 18; 21; 24; 27]

引数をSeq.skipいじって、必要なものを取得できます。

たとえば、次の場合[2; 4; 6; 8; 10]:

List.init 6 ((*) 2)
|> List.tail

または:

List.init 6 ((*) 2)
|> Seq.skip 1
|> List.ofSeq
于 2011-09-29T18:57:03.007 に答える