C#-ban hogy írjak olyan metódust, amely vissza adja egy n elemű lista összes kombinációját (úgy, hogy a paraméterben meg tudom adni, hogy hány ismétlődés lehet benne)?
tehát ha n = [1, 2, 3] akkor ha a paraméter 1 akkor a kombinációk
(1), (2), (3), (1 2), (1 3), (2 3), (1 2 3)
ha viszont a paraméter 2 ugyanennél az esetnél, akkor:
(1), (1 1), (2), (2 2), (3), (3 3), (1 2), (1 3), (2 3), (1 2 3), (1 1 2), (1 1 3), (1 2 2), (1 3 3), (2 2 3), (3 3 2)
ha ki szeretném hagyni a képletből az ismétlődést, akkor az alábbi kód szépen működik (ezt kéne felturbózni kicsit):
public static IEnumerable<IEnumerable<T>> DifferentCombinations<T>(this IEnumerable<T> elements, int k)
{
return k == 0 ? new[] { new T[0] } :
elements.SelectMany((e, i) =>
elements.Skip(i + 1).DifferentCombinations(k - 1).Select(c => (new[] { e }).Concat(c)));
}
Ez egy sima backtracking mintapelda, csak tarolnod kell az elemek elofordulasanak a szamat is az aktualis kombinacional.
Gondold at nyelvtol fuggetlenul az algoritmust, milyen adatstrukturaban tartanad nyilvan az ismetlodeseket, implementald, aztan raersz utana gondolkozni, hogy LINQ-val (vagy minek hivjak ezt, nem ertek C#-hoz) megvalosithato-e es hogyan.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!