我试图将一个列表输入到函数中,它向我发送了一个列表,其中使用 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/