我想创建一个数字倍数的列表。例如[2; 4; 6; 8; 10]将是0到10之间的2的倍数。
我如何动态创建x的倍数列表?是否可以在不设置上限的情况下完成?
一种方法是在0和一些疯狂的大数字之间创建一个列表,然后使用mod函数对其进行过滤。试图测试这个,创建一个0到一些疯狂的大数字列表导致内存不足异常(等待30秒左右)。
我觉得F#有一些非常简单和令人敬畏的方式来构建这样的列表,但是我太过于知道它是什么了。帮助
答案 0 :(得分: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)
或使用您的过滤器模式策略:
seq { 1 .. 1000000} |> Seq.filter (fun x -> x%3=0) |> Seq.take 6 |> Seq.toList
答案 1 :(得分: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;
}
}
答案 2 :(得分: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
答案 3 :(得分:1)
[ firstValue..Step..endValue]
[2..2..10] =&gt; [2; 4; 6; 8; 10]
其他方式
Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))