recursion - F# 使用函数式编程将列表减半

标签 recursion f# functional-programming

我试图将一个列表输入到函数中,它向我发送了一个列表,其中使用 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,所以希望以下内容接近您正在寻找的内容(也许注释格式已更改?!)。这个想法是,当你用尽影子时,你就完成了。您的代码几乎就在那里,但是对影子尾部长度的测试毫无意义。

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

关于recursion - F# 使用函数式编程将列表减半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694505/

相关文章:

grails - Geb在Grails应用中发现错误的&lt;title&gt;标签

java - 如何扫描所有 mp3 文件,而不仅仅是从我制作的 android 媒体播放器的特定路径

java - 递归方法创建Json对象

haskell - 有人对函数式编程入门有什么建议吗?

list - 在列表列表中排序列表 F#

haskell - 列表推导式的奇怪行为

c# - 在 F# 中处理资源清理的功能方法

c - 合并排序中划分部分的无限循环

algorithm - 具有恒定组合时间的递归算法的时间限制

.net - F# 函数在没有被调用的情况下运行