我試圖通過該序列的第一個元素遞歸地追加到列表中建立從序列列表:尾遞歸複製到在F#列表
open System
let s = seq[for i in 2..4350 -> i,2*i]
let rec copy s res =
if (s|>Seq.isEmpty) then
res
else
let (a,b) = s |> Seq.head
Console.WriteLine(string a)
let newS = s |> Seq.skip(1)|> Seq.cache
let newRes = List.append res ([(a,b)])
copy newS newRes
copy s ([])
兩個問題:
。得到一個堆棧溢出,這意味着我的尾部recusive工藝很爛
和
。爲什麼當我把|> Seq.cache
放在這裏let newS = s |> Seq.skip(1)|> Seq.cache
時,代碼快了100倍。
(請注意,這只是一個小的鍛鍊,我知道你能做到Seq.toList等)
感謝很多的作品是
的一種方式(這兩點仍然有點怪異對我來說):
let toList (s:seq<_>) =
let rec copyRev res (enum:Collections.Generic.IEnumerator<_*_>) =
let somethingLeft = enum.MoveNext()
if not(somethingLeft) then
res
else
let curr = enum.Current
Console.WriteLine(string curr)
let newRes = curr::res
copyRev newRes enum
let enumerator = s.GetEnumerator()
(copyRev ([]) (enumerator)) |>List.rev
讓newRes = curr :: res - 小改進 – 2010-08-17 14:36:04
改了,謝謝 – jlezard 2010-08-17 14:40:21