String 在字符串[]列表f中列出一个元素#
我有一个string[]列表,我希望将所有列表的string数组中的第5个元素分组 我发现了两种不同的方法String 在字符串[]列表f中列出一个元素#,string,list,recursion,f#,stack-overflow,String,List,Recursion,F#,Stack Overflow,我有一个string[]列表,我希望将所有列表的string数组中的第5个元素分组 我发现了两种不同的方法 let rec Publication x y (z:string [] list) = if x < z.Length then let muro = [z.[x].[y]] let rest = Publication (x+1) y z List.append muro rest else []
let rec Publication x y (z:string [] list) =
if x < z.Length then
let muro = [z.[x].[y]]
let rest = Publication (x+1) y z
List.append muro rest
else []
在第一种情况下,处理大量数据时会出现堆栈溢出错误,而第二种情况需要很长时间。有人能帮我找到第三种更有效的方法吗?谢谢 从表面上看,您的第二个版本似乎是合理的,但我想知道问题是否不是对
z
的索引访问,因为列表是从头部为每个z.[I]
调用迭代的。我想尝试的是简单明了的:
let publication idx (lst: string [] list) =
lst |> List.map (fun arr -> arr.[idx])
您有一个数组列表和一个索引,您可以遍历该列表并通过每个数组的索引获取元素。您可以将第一个数组转换为尾部递归(从而防止堆栈使用),如果您关心结果的顺序相同,只需反转结果即可。我怎么做?我从来没有理解过:(一旦你理解了,一个全新的世界将为你打开:)理解是很重要的,所以试着去理解。不幸的是,我对F#的了解还不足以给你一个答案,但许多其他语言也是如此,比如Scheme。这是可行的,但需要13秒才能完成(与我的第二个选项相同)。。解决我的问题需要很长时间:(您的问题有多大?请尝试转换为数组而不是列表。17800是列表的大小。我将其转换为数组,但只花了一秒钟的时间。您在其他地方花费的时间更少。也许您正在尝试打印返回的所有内容?对于18000个元素,您和我的版本,我的时间都不到半秒。对于180个。000,你的是32秒,我的是3秒。我如何才能看到我的代码在哪里使用时间?在visual studio中
let publication idx (lst: string [] list) =
lst |> List.map (fun arr -> arr.[idx])