我想創建一個數字的倍數的列表。例如[2; 4; 6; 8; 10]將是0到10之間的2的整數倍。F#創建x的倍數列表?
我該如何動態創建x的倍數列表?是否有可能沒有設置上限呢?
做到這一點的一種方法是創建一個介於0和一些瘋狂的大數字之間的列表,然後使用mod函數對其進行過濾。試圖測試這個,創建一個0到一個瘋狂的大數目列表導致了內存不足的異常(30秒左右後等待)。
我覺得F#有一些超級簡單而且很棒的方式來創建這樣的列表,但我太瞭解它是什麼了。幫幫我?
我想創建一個數字的倍數的列表。例如[2; 4; 6; 8; 10]將是0到10之間的2的整數倍。F#創建x的倍數列表?
我該如何動態創建x的倍數列表?是否有可能沒有設置上限呢?
做到這一點的一種方法是創建一個介於0和一些瘋狂的大數字之間的列表,然後使用mod函數對其進行過濾。試圖測試這個,創建一個0到一個瘋狂的大數目列表導致了內存不足的異常(30秒左右後等待)。
我覺得F#有一些超級簡單而且很棒的方式來創建這樣的列表,但我太瞭解它是什麼了。幫幫我?
這將產生數倍的無限序列:
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;
}
}
序列(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)
或與您的過濾器MOD策略:
seq { 1 .. 1000000} |> Seq.filter (fun x -> x%3=0) |> Seq.take 6 |> Seq.toList
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
[ firstValue..Step..endValue]
[2..2..10] => [2; 4; 6; 8; 10]
其他方式
Seq.initInfinite id |> Seq.map (((+) 1) >> ((*) 2))
+1。或'seq {2..2..10}'用於延遲序列。恥辱F#沒有開放式範圍表達式(例如Haskell中的[[2.4 ..]') –
range爲int,Limit max System.Int32.MaxValue:2147483647。同樣由展開 – BLUEPIXY
StackOverflow的。您提出問題的地方,以及您在後面尋找確切答案的地方。 – Matthew