Это функционально дружественный подход к программированию:
def combine[T](xx: List[T], yy: List[T]): List[(List[T], List[T])] = (xx, yy) match {
case (Nil, Nil) => Nil
case (x :: Nil, y :: Nil) => List(
(List(x), List(y)),
(List(y), List(x))
)
case (x :: xs, y :: ys) =>
val results = combine(xs, ys)
results.map { case (rx, ry) => (x :: rx, y :: ry) } ++
results.map { case (rx, ry) => (y :: rx, x :: ry)}
case _ =>
sys.error("Input of non-matching sizes")
}
К сожалению, это не хвостовая рекурсия.
Но это работает:
val r = combine(List(1, 2, 3), List(4, 5, 6))
r.foreach(println)
Вывод:
(List(1, 2, 3),List(4, 5, 6))
(List(1, 2, 6),List(4, 5, 3))
(List(1, 5, 3),List(4, 2, 6))
(List(1, 5, 6),List(4, 2, 3))
(List(4, 2, 3),List(1, 5, 6))
(List(4, 2, 6),List(1, 5, 3))
(List(4, 5, 3),List(1, 2, 6))
(List(4, 5, 6),List(1, 2, 3))