我是F#的新手,正在尋找一個取N *個索引和一個序列並給出N個元素的函數。如果我有N個索引,它應該等於concat Seq.nth index0,Seq.nth index1 .. Seq.nth indexN,但它應該只掃描序列中的indexN元素(O(N)),而不是index0 + index1 +。 。+ indexN(O(N^2))。F#中有N個不同索引的序列取N個元素
綜上所述,我在尋找類似:
//For performance, the index-list should be ordered on input, be padding between elements instead of indexes or be ordered when entering the function
seq {10 .. 20} |> Seq.takeIndexes [0;5;10]
Result: 10,15,20
我可以使用了序列{產量...}使這個,有一個指數計數器打勾當一些元素應該傳遞但如果F#提供了一個很好的標準方式,我寧願使用它。
感謝:)...
增加:我做了以下內容。它有效,但並不漂亮。歡迎提出建議
let seqTakeIndexes (indexes : int list) (xs : seq<int>) =
seq {
//Assume indexes is sorted
let e = xs.GetEnumerator()
let i = ref indexes
let curr = ref 0
while e.MoveNext() && not (!i).IsEmpty do
if !curr = List.head !i then
i := (!i).Tail
yield e.Current
curr := !curr + 1
}
您的指數是否有序(即從最小到最大或相反方向)? – 2010-07-24 00:34:12
只是想知道,但你正在寫什麼樣的程序,這需要索引訪問你的序列? – Juliet 2010-07-24 01:15:12
帕維爾:我們可以說他們是有序的。朱麗葉:其實,這是我爲解決和可以通過純粹的材料解決的項目歐拉問題40。但我希望我的功能解決方案看起來更好:) – 2010-07-24 08:48:36