【问题标题】:Listing one element in a string[] list f#在 string[] list f# 中列出一个元素
【发布时间】:2014-10-17 23:54:25
【问题描述】:

我有一个 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 是 string[] 列表,y 是我希望列出的元素。 和

let Publication x (z:string [] list) = [for i in 0 .. (z.Length-1)  -> z.[i].[x]] 

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

【问题讨论】:

  • 您可以将第一个转换为尾递归(从而防止堆栈使用),如果您关心它的顺序相同,只需反转结果。
  • 我该怎么做?我从来不理解尾递归:(
  • 一旦你这样做了,一个全新的世界将为你打开:) 理解这一点很重要,所以试着这样做。不幸的是,我对 F# 的了解不足以给你一个答案,但是对于许多其他语言也是如此,比如 Scheme。

标签: string list recursion f# stack-overflow


【解决方案1】:

从表面上看,您的第二个版本似乎是明智的,但我想知道问题是否不在于对 z 的索引访问,因为每个 z.[i] 调用的列表都是从头部迭代的。我会尝试简单明了:

let publication idx (lst: string [] list) = 
    lst |> List.map (fun arr -> arr.[idx])

你有一个数组列表和一个索引,你遍历列表并通过每个数组的索引获取元素。

【讨论】:

  • 这可行,但需要 13 秒才能完成(与我的第二个选项相同).. 解决我的问题需要很长时间:(
  • 您的问题有多大?尝试转换为数组而不是列表。
  • 17800 是列表的大小。我将它转换为一个数组,但只花了一秒钟的时间
  • 您正在其他地方度过时光。也许您正在尝试打印您返回的所有内容?对于 18.000 个元素,您和我的版本对我来说都不到半秒。 180.000,你的是 32s,我的是 3s。
  • 如何查看我的代码在哪里使用时间?在视觉工作室
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
相关资源
最近更新 更多