Scala尾递归实现嵌套列表过滤技术问题咨询
尾递归嵌套列表过滤Scala函数详解
咱来好好拆解一下这个用来递归过滤嵌套列表中所有元素1的尾递归Scala函数,它还会自动移除那些完全由1组成的空嵌套列表,实用性拉满。
函数代码实现
def filter(list : List[Any], acc : List[Any] = Nil) : List[Any] = { list match { case Nil => acc case (l : List[_]) :: tail => val nested = filter(l) if (nested.isEmpty) filter(tail, acc) else filter(tail, acc :+ nested) case 1 :: tail => filter(tail, acc) case other :: tail => filter(tail, acc :+ other) } }
核心逻辑拆解
这个函数用模式匹配实现尾递归处理,每一步的逻辑都很清晰:
- 终止条件:当传入的列表为空(
case Nil),直接返回累积的结果acc,这是尾递归能正确结束的关键。 - 处理嵌套子列表:碰到子列表元素时,先递归处理这个子列表得到
nested;如果处理后的子列表是空的(说明原列表全是1),就直接跳过它,继续处理剩余元素;否则把处理后的有效子列表加入累积结果,再处理剩下的元素。 - 精准过滤元素1:只要当前元素是1,就直接跳过,不加入累积结果,继续处理后续元素。
- 保留其他有效元素:如果是除了1和子列表之外的其他元素,就把它加入累积结果,再处理剩余元素。
输入输出示例
输入
filter(List(1, 3, 4, List(1, 4 ,5), List(1)))
输出
res0: List[Any] = List(3, 4, List(4, 5))
可以看到,顶层的1被过滤了,子列表里的1也被移除,而完全由1组成的List(1)因为处理后为空,直接被删掉了。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

