gpt4 book ai didi

list - F#中的列表操作

转载 作者:行者123 更新时间:2023-12-04 13:54:37 24 4
gpt4 key购买 nike

我希望使此功能能够实现的是:

  • 生成一个由count
  • 指定的长度为随机整数的列表
  • 生成另一个随机数以替换列表
  • 的第一个元素
  • 排序列表
  • 将列表分成两半,丢弃后半部分
  • 丢弃列表
  • 的第一个元素
  • 重复2-5,除非列表为空

  • 我到目前为止(但没有工作)的内容如下。怎么了
    let go count =
    let rec cut l =
    if List.length l = 0 then l
    printfn "%A" l
    let list = System.Random().Next(100)::List.tail l
    let cut list =
    let firstHalf= list |> Seq.take (List.length list / 2) |> Seq.toList
    firstHalf
    let listSorted = List.sort list
    cut (List.tail listSorted)
    let r = System.Random()
    let list1 = List.init count (fun numbers -> r.Next(100))
    printfn "List = %A" list1
    cut list1

    最佳答案

    一些提示:

  • 不要测试List.length L = 0是否为空。每次测试将花费与列表中元素数量一样长的时间。相反,使用模式匹配进行测试,这几乎是瞬时的:
  • 每次调用cut函数时,不要实例化随机数生成器的新实例:let list = System.Random()...。这样做意味着您可能会获得相同的数字(每个实例都使用当前系统时间作为生成器的种子)。只需将声明r = System.Random()向上移动一点,然后在整个代码中使用该生成器。

  • 例子:
    let rec cut l =
    match l with
    | [] -> // the list is empty, end the recursion here
    | head::tail -> // the list consists of the head element and the rest
    // you can refer to head and tail in your code here
    let newlist = r.next(100) :: tail
  • 您在递归“cut”函数中声明了一个名为“cut”的函数,这意味着递归函数中对“cut”的最后一次调用实际上会调用您在其中定义的非递归函数。在此使用其他名称。
  • 您已经写了'if List.length l = 0 then l',它(除了不使用模式匹配之外)还带来了一个问题:F#中的'if'是一个表达式,就像C#中的?运算符一样。在C#中,这意味着
    (l.Count == 0) ? l : //other case missing! error! danger!
  • 另一个提示:对列表进行排序后,无需在每次添加新的随机元素时再次进行排序。您可以编写在排序列表中插入新元素的代码,该代码比添加元素然后进行排序更有效。我将把插入式排序列表留作练习。

  • 我希望这些技巧有用。

    关于list - F#中的列表操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6223814/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com