Encontrando todas as combinações de valores possíveis entre duas matrizes

Tenho duas matrizes de strings, não necessariamente do mesmo comprimento, quero encontrar todos os "conjuntos" possíveis de combinações entre dois valores das matrizes, sem repetições de nenhuma das matrize
Por exemplo, dadas as matrizes:
{"A1", "A2", "A3"}
{"B1", "B2"}
O resultado que eu quero são os seguintes conjuntos:
{("A1", "B1"), ("A2", "B2")}
{("A1", "B1"), ("A3", "B2")}}
{("A1", "B2"), ("A2", "B1")}
{("A1", "B2"), ("A3", "B1")}}
{("A2", "B1"), ("A3", "B2")}}
{("A2", "B2"), ("A3", "B1")}}

Minha direção geral é criar uma função recursiva que tome como parâmetro as duas matrizes e remove cada sequência "escolhida" de cada vez, chamando a si própria até que uma das matrizes esteja vazia, no entanto, estou meio preocupada com problemas de desempenho (preciso executar esse código em cerca de 1000 pares de matrizes de string
Pode alguém me direcionar para um método eficiente de fazer isso?

questionAnswers(7)

yourAnswerToTheQuestion