3

我想创建一个数字的倍数的列表。例如 [2; 4;6;8个;10] 将是 0 到 10 之间 2 的倍数。

我将如何动态创建这样一个 x 的倍数列表?是否可以在不设置上限的情况下做到这一点?

一种方法是在 0 和一些疯狂的大数之间创建一个列表,然后使用 mod 函数对其进行过滤。尝试对此进行测试,创建一个从 0 到某个疯狂的大数字的列表导致内存不足异常(大约 30 秒后等待)。

我觉得 F# 有一些超级简单和很棒的方法来构建这样一个列表,但是我太新手了,不知道它是什么。帮助?

4

4 回答 4

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 回答
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 回答
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 回答