可能重複:
Linked list partition function and reversed results一些基本的序列,並列出問題
其實我不在乎輸入類型或輸出類型,任何seq, array, list
會做。 (它沒有被通用)目前我的代碼需要list
作爲輸入,並(list * list)
作爲輸出
let takeWhile predicator list =
let rec takeWhileRec newList remain =
match remain with
| [] -> (newList |> List.rev, remain)
| x::xs -> if predicator x then
takeWhileRec (x::newList) xs
else
(newList |> List.rev, remain)
takeWhileRec [] list
然而,有一個陷阱。像我看到的那樣,List.rev
是O(n^2),這可能會主導整體速度?我認爲這是比醜陋的解決方案更慢:Seq.takeWhile
,然後count
,然後採取tail
N次......這仍然是O(n)的
(如果有一個C#列表,然後我會用,如果沒有爲扭轉這種局面......)
A面的問題,什麼是Array.ofList
和List.toArray
,或者更一般地說,A.ofB
和List, Seq, Array
B.ofA
區別?
是seq myList
是否與List.toSeq myList
相同?
另一方面的問題是嵌套Seq.append
與Seq.concat
具有相同的複雜性?
例如
Seq.append (Seq.append (Seq.append a b) c) d // looks aweful
Seq.concat [a;b;c;d]
@JohnPalmer謝謝,我很快就會刪除這個問題。 – colinfang
不需要刪除它 - 其他人可能會出現同一個問題 –
如果'List.rev'確實會出錯,請參閱[我的答案](http://stackoverflow.com/a/7199989/162396)以解決類似的問題爲基於延續的版本。 – Daniel