recursion - 使用递归和模式匹配从列表中删除元素
问题描述
在 F# 中使用递归,我应该编写一个递归函数来从列表 l 中删除一个整数 n。该函数接受 int 和 iList 并返回一个 iList(它是整数列表)
这是我到目前为止所拥有的:
let rec remove n l
match l with
| E -> failwith "Empty List"
| L(h,E) -> if (h=n) then 0 else h
| L(h,t) -> if (h=n) then remove n t else h + remove n t
在上面的代码中,我对其进行了设置,以便在从列表中排除给定整数 n 后返回列表中元素的总和,而不是列表中的实际元素。
在排除给定整数 n 后,我需要帮助返回列表的剩余元素。
解决方案
您可以使用累加器参数(acc
在下面的代码中)这样做。该acc
参数用于携带上一次调用递归函数的结果,从而构建最终结果。这是函数式编程中的常见范例。在这种情况下,我们从acc
一个空列表开始并向其中添加元素,但在匹配时跳过x
。
let rec remove x l acc =
match l with
| [] -> acc
| h::t when x = h -> List.append acc t
| h::t -> remove x t (List.append acc [h])
像这样使用它:
remove 1 [1;2;3] []
另一种方法是使用List.collect
:
let remove_use_collect x l =
let helper y =
if x = y then [] else [y]
List.collect helper l
但是我认为了解第一种方法以及如何使用累加器参数很重要,因为它在函数式编程中很常见,您无法修改值。你会发现很多 List 模块函数都是在某个地方使用累加器实现的。
推荐阅读
- angular - 从 cmd 调用 Angular 语言服务
- python - 有没有办法在 Python 中识别 RNDIS 连接/适配器?然后配置那个适配器?
- c++ - 在结构中添加变量结构作为有效负载,以便在 C++ 中通过 udp 发送
- node.js - jest.mock 找不到模块
- java - 如何使用 selenium webdriver 单击角度元素?
- python - 在子查询中使用查询集时,Django 只返回 id 字段而不是整个对象
- javascript - 无法下载带有过滤器的画布图像
- reactjs - React-Table:在父组件中获取 selectedRowIds
- javascript - 在 VueJS 中动态更新的可编辑下拉列表
- console - rabbitmq管理控制台如何设置配置