我正在尝试向函数中输入一个列表,它向我发送了一个列表,其中包含使用下面的递归使用f#删除的元素的前半部分,但是我一直遇到我无法弄清的基本情况问题。有什么想法吗?我正在使用第二个阴影列表来计算我需要走多远,直到我进入列表的一半为止(一次删除两个元素)

let rec dropHalf listToDrop shadowList =
    match shadowList with
    | [] -> listToDrop
    | shadowHead2::shadowHead1::shadowTail -> if shadowTail.Length<=1 then listToDrop else
                                    match listToDrop with
                                    |[] -> listToDrop
                                    |listToDropHead::listToDropTail -> dropHalf listToDropTail shadowTail

最佳答案

let rec dropHalf listToDrop shadowList =
    match shadowList with
    | [] -> listToDrop
    | shadowHead2::[] -> listToDrop   (* odd number! *)
    | shadowHead1::shadowHead2::shadowTail ->
        match listToDrop with
        | [] -> listToDrop   (* should never happen? *)
        | listToDropHead::listToDropTail -> dropHalf listToDropTail shadowTail


恐怕我不使用F#,但是它类似于ocaml,因此希望以下内容与您要查找的内容接近(也许注释格式已更改?!)。这个想法是,当您耗尽阴影时,您就完成了。您的代码几乎就在那儿,但是测试阴影尾部的长度没有意义。

我想强调一点,这并不是像任何人都可以在“现实生活中”写的东西,但是听起来您正在与一些奇怪的要求作斗争。

10-08 03:08