Создание перестановок из многомерного массива в Ruby - PullRequest
13 голосов
/ 07 апреля 2011

У меня есть следующий многомерный массив в Ruby:

[[1,2], [3], [4,5,6]]

Мне нужно иметь следующий вывод:

[[1,3,4], [1,3,5], [1,3,6], [2,3,4], [2,3,5], [2,3,6]]

Я пытался создать рекурсивную функцию, но мне не очень повезло.

Существуют ли какие-либо функции Ruby, которые помогут с этим? Или это единственный вариант сделать это рекурсивно?

Спасибо

1 Ответ

31 голосов
/ 07 апреля 2011

Да, Array#product делает именно это ( Декартово произведение ):

a = [[1,2], [3], [4,5,6]]
head, *rest = a # head = [1,2], rest = [[3], [4,5,6]]
head.product(*rest)
#=> [[1, 3, 4], [1, 3, 5], [1, 3, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6]] 

Другой вариант:

a.inject(&:product).map(&:flatten)
#=> [[1, 3, 4], [1, 3, 5], [1, 3, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6]] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...