Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 在字符串[]列表f中列出一个元素#_String_List_Recursion_F#_Stack Overflow - Fatal编程技术网

String 在字符串[]列表f中列出一个元素#

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 []

我有一个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  []

在第一种情况下,处理大量数据时会出现堆栈溢出错误,而第二种情况需要很长时间。有人能帮我找到第三种更有效的方法吗?谢谢

从表面上看,您的第二个版本似乎是合理的,但我想知道问题是否不是对
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])