如何从Scala中的项目列表中获取n个项目的组合?

如何从Scala中的项目列表中获取n个项目的组合?,scala,recursion,combinations,Scala,Recursion,Combinations,我需要从项目列表中生成大小为n的所有组合。我试图用递归函数来解决这个问题。以下是我的解决方案: def组合(i:Int,value:List[Symbol]):List[List[Symbol]={ 如果(i==0)列表(Nil) else if(i==value.size)列表(value) else值匹配{ 案例无=>列表(无) 案例头部::尾部=>{ 组合(i,tail)::组合(i-1,tail)映射{tailCombos=>head::tailCombos} } } } 以下是我的测

我需要从项目列表中生成大小为n的所有组合。我试图用递归函数来解决这个问题。以下是我的解决方案:

def组合(i:Int,value:List[Symbol]):List[List[Symbol]={
如果(i==0)列表(Nil)
else if(i==value.size)列表(value)
else值匹配{
案例无=>列表(无)
案例头部::尾部=>{
组合(i,tail)::组合(i-1,tail)映射{tailCombos=>head::tailCombos}
}
}
}
以下是我的测试输入:
组合(3,列表('a,'b,'c,'d))

我越来越
List(List('a,'b,'c,'d),List('a,'b,'c,'d),List('a,'b,'c,'d),List('a,'b,'c))

而不是
List(List('b,'c,'d),List('a,'b,'d),List('a,'c,'d),List('a,'b,'c))


我还可以参考其他解决方案,所以请不要给我一些有效的解决方案。然而,我想知道为什么我的代码不起作用,需要修复什么。

这只不过是一些语法上的混乱。基于空格的语法(有一个名称,但我忘了)是在早期引入的,只会引起混乱。我强烈建议坚持点语法

发生的事情是由于从左到右的求值,map被应用于组合(i,tail)的整个结果::组合(i-1,tail)

相反,如果你这样做了

 combinations(i, tail) ::: combinations(i - 1, tail).map{ tailCombos => head :: tailCombos }
你会得到你想要的结果

工作支架-->


另外,如果你使用的是cats,你也可以依靠半群上的内置组合来生成这个

我的错,我对算法而不是语法有疑问,所以我不认为中缀符号可能是问题所在。是的,只要可能,我会坚持使用点符号。