我试图通过该序列的第一个元素递归地追加到列表中建立从序列列表:尾递归复制到在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