You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:29:09