List F#创建x的倍数列表?
我想创建一个数字的倍数列表。例如[2;4;6;8;10]是0到10之间2的倍数 我如何动态地创建这样一个x的倍数列表?有没有可能不设上限就这样做 一种方法是创建一个介于0和某个疯狂的大数字之间的列表,然后使用mod函数对其进行过滤。为了测试这一点,创建一个0到某个疯狂的大数字的列表会导致内存不足异常(等待大约30秒后) 我觉得F#有一些非常简单和很棒的方法来建立这样一个列表,但我是一个新手,还不知道它是什么。帮助?序列(IEnumerables)在这里提供您想要的惰性:List F#创建x的倍数列表?,list,f#,factors,List,F#,Factors,我想创建一个数字的倍数列表。例如[2;4;6;8;10]是0到10之间2的倍数 我如何动态地创建这样一个x的倍数列表?有没有可能不设上限就这样做 一种方法是创建一个介于0和某个疯狂的大数字之间的列表,然后使用mod函数对其进行过滤。为了测试这一点,创建一个0到某个疯狂的大数字的列表会导致内存不足异常(等待大约30秒后) 我觉得F#有一些非常简单和很棒的方法来建立这样一个列表,但我是一个新手,还不知道它是什么。帮助?序列(IEnumerables)在这里提供您想要的惰性: let multiple
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
这将产生一个无限的倍数序列:
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#:
静态IEnumerable倍数(int n){
int i=n;
while(true){
收益率i;
i+=n;
}
}
您可以使用参数和Seq.skip
来获取所需内容
例如,对于[2;4;6;8;10]
:
List.init 6 ((*) 2)
|> List.tail
或:
[2..2..10]=>[2;4;6;8;10]
另一种方式
Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))
堆栈溢出。在这里,你提出了一个问题,并在片刻后得到了你想要的确切答案。+1。或
seq{2..2..10}
表示惰性序列。羞愧F#没有开放式范围表达式(如Haskell中的[2,4..]
)int的范围,Limit max System.Int32.MaxValue:2147483647。展开时相同
List.init 6 ((*) 2)
|> List.tail
List.init 6 ((*) 2)
|> Seq.skip 1
|> List.ofSeq
[ firstValue..Step..endValue]
Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))