重複の可能性:
リンクリストのパーティション関数と逆の結果
実際、私は入力タイプや出力タイプを気にしませ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#リストがある場合は、それを逆にすることなく使用します...)
Array.ofList
副次的な質問ですが、とList.toArray
、またはより一般的には、A.ofB
とB.ofA
の違いは何List, Seq, Array
ですか?
とseq myList
同じList.toSeq myList
ですか?
もう1つの副次的な質問は、ネストされているのは?Seq.append
と同じ複雑さです。Seq.concat
例えば
Seq.append (Seq.append (Seq.append a b) c) d // looks aweful
Seq.concat [a;b;c;d]