у меня есть список списков Int <List<List<int>>
, который представляет собой направленный векторалгоритмическая функции для создания всех возможных комбинаций из списка векторов
, например
(1,2)
(1,3)
(2,4)
(3,5)
(4,3)
(5,1)
и я хочу, чтобы создать все возможные маршруты с этими векторами, так что конечный маршрут не создает бесконечный круг (заканчивается на себя)
так:
(1,2)
(1,3)
(2,4)
(3,5)
(4,3)
(5,1)
(1,2,4)
(1,2,4,3)
(1,2,4,3,5)
(1,2,4,3,5,1)
(1,3,5)
(1,3,5,1)
(2,4,3)
(2,4,3,5)
(2,4,3,5,1)
(2,4,3,5,1,2)
(3,5,1)
etc...
Я не нашел эффективного способа совершения такой вещи.
Я предыдущий попытался создать все возможные комбинации, используя
private IEnumerable<int> constructSetFromBits(int i)
{
for (int n = 0; i != 0; i /= 2, n++)
{
if ((i & 1) != 0)
yield return n;
}
}
public IEnumerable<List<T>> ProduceWithRecursion(List<T> allValues)
{
for (var i = 0; i < (1 << allValues.Count); i++)
{
yield return ConstructSetFromBits(i).Select(n => allValues[n]).ToList();
}
}
, который работал хорошо, но игнорировали направление аспект проблемы.
Метод не должен быть рекурсивными, хотя я подозреваю, что может быть наиболее разумным способом пойти об этом
Спасибо за это! Выглядит лучше, чем то, что у меня было ... Я попробую, и я разрешу соответствующим образом – Nick