Scala自定义combination函数异常排查及修正咨询
我来帮你拆解下这个组合函数的问题所在,以及为什么你更新后的代码能解决问题:
原代码的核心问题
你遇到的「出现长度不足3的组合」问题,根源在第一个模式匹配分支:
case (_, Nil) => List(Nil)
这个分支的问题是:当递归到空列表时,它返回了一个包含空列表的列表。这会导致在递归构建组合的过程中,哪怕剩余元素根本凑不够n-1个,依然会生成一个空列表,然后和前面的元素拼接,最终就出现了像List('f)(也就是'f :: Nil)、List('d, 'f)这类长度不达标的结果。
举个具体例子:当递归调用combination(2, List('f))时,因为2 > 1,本来应该返回空列表,但原代码里的空分支返回List(Nil),就会错误地让后续逻辑拼接出'f :: Nil这种长度为1的结果,混入最终输出里。
另外原代码里case (_, _) if n > ls.size => List.empty虽然和Nil功能相近,但统一用Nil更贴合Scala的编码习惯,也能避免不必要的语义混淆。
修复后的代码为什么能正常工作
你更新后的代码把这个分支改成了:
case (_, Nil) => Nil
这个修改让递归遇到空列表时直接返回空,不会生成额外的空列表元素。这样一来,当剩余元素数量不足以满足n-1的要求时,整个分支就不会产生任何结果,自然也就不会出现长度不足的组合了。
再确认下你的subList函数:它的逻辑是获取当前元素之后的所有元素,这样能保证生成的组合是不重复、按原列表顺序的(不会出现('b, 'a)这种逆序的无效组合),这部分完全没问题,不需要调整。
现在你再调用combination(3, List('a, 'b, 'c, 'd, 'e, 'f)),得到的就全是长度为3的合法组合了。
内容的提问来源于stack exchange,提问作者tomcy

