Группировка списка в непересекающиеся множества с использованием рекурсии в Scala - PullRequest
0 голосов
/ 21 июня 2019

У меня есть следующий код для группировки элементов в непересекающиеся множества.Я получаю требуемый вывод тоже.Может кто-нибудь объяснить, как работает рекурсия, чтобы получить этот вывод?

object combination 
{
    def main(args:Array[String])
    {
        def flatMapSublists[A,B](ls: List[A])(f: (List[A]) => 
        List[B]):List[B] =
        ls match 
        {
            case Nil => Nil
            case sublist@(_ :: tail) => f(sublist)  
            :::flatMapSublists(tail)(f)
        }
        def combinations[A](n: Int, ls: List[A]): List[List[A]] =
        if (n == 0) List(Nil)
        else flatMapSublists(ls) 
        { 
            sl => combinations(n - 1, sl.tail)map {sl.head :: _}
        }                                             
        println(combinations(3, List('a, 'b, 'c, 'd, 'e, 'f)) )
    }
}

I get this output as expected
List(List('a, 'b, 'c), List('a, 'b, 'd), List('a, 'b, 'e), List('a, 'b, 
'f), List('a, 'c, 'd), List('a, 'c, 'e), List('a, 'c, 'f), List('a, 'd, 
'e), List('a, 'd, 'f), List('a, 'e, 'f), List('b, 'c, 'd), List('b, 'c, 
'e), List('b, 'c, 'f), List('b, 'd, 'e), List('b, 'd, 'f), List('b, 'e, 
'f), List('c, 'd, 'e), List('c, 'd, 'f), List('c, 'e, 'f), List('d, 'e, 
'f))
Any help appreciated
...