Skip to content

Commit d7f5b46

Browse files
committed
fix variation
1 parent a3307f4 commit d7f5b46

File tree

3 files changed

+33
-21
lines changed

3 files changed

+33
-21
lines changed

Algorithm.Sandbox.Tests/Combinatorics/Variation_Tests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,26 @@ public void Variation_Without_Repetitions_Smoke_Test()
3030
Variations = Variation.Find<char>(input, 3, false);
3131
Assert.AreEqual(combination(input.Count, 3) * factorial(3), Variations.Count);
3232

33-
input = "monster".ToCharArray().ToList();
34-
Variations = Variation.Find<char>(input, 4, false);
35-
Assert.AreEqual(combination(input.Count, 4) * factorial(4), Variations.Count);
33+
input = "monsters".ToCharArray().ToList();
34+
Variations = Variation.Find<char>(input, 3, false);
35+
Assert.AreEqual(combination(input.Count, 3) * factorial(3), Variations.Count);
3636
}
3737

3838

3939
[TestMethod]
4040
public void Variation_With_Repetitions_Smoke_Test()
4141
{
42-
var input = "".ToCharArray().ToList();
43-
var variations = Variation.Find<char>(input, 3, true);
44-
Assert.AreEqual(0, variations.Count);
45-
46-
input = "abc".ToCharArray().ToList();
47-
variations = Variation.Find<char>(input, 2, true);
42+
var input = "abcd".ToCharArray().ToList();
43+
var variations = Variation.Find<char>(input, 2, true);
4844
Assert.AreEqual(Math.Pow(input.Count, 2), variations.Count);
4945

5046
input = "scan".ToCharArray().ToList();
5147
variations = Variation.Find<char>(input, 3, true);
5248
Assert.AreEqual(Math.Pow(input.Count, 3), variations.Count);
49+
50+
input = "".ToCharArray().ToList();
51+
variations = Variation.Find<char>(input, 3, true);
52+
Assert.AreEqual(0, variations.Count);
5353
}
5454

5555
}

Algorithm.Sandbox/Combinatorics/Combination.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,6 @@ private static void Recurse<T>(List<T> input, int r, bool enableRepetition,
2626
result.Add(new List<T>(prefix));
2727
return;
2828
}
29-
else
30-
{
31-
32-
}
3329

3430
for (int j = k; j < input.Count; j++)
3531
{

Algorithm.Sandbox/Combinatorics/Variation.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,36 @@ public static List<List<T>> Find<T>(List<T> input, int r, bool enableRepetition)
2222
{
2323
var result = new List<List<T>>();
2424

25-
var combinations = Combination.Find(input, r, false);
25+
Recurse(input, r, enableRepetition, new List<T>(), new HashSet<int>(), result);
2626

27-
foreach (var combination in combinations)
27+
return result;
28+
}
29+
30+
private static void Recurse<T>(List<T> input, int r, bool enableRepetition,
31+
List<T> prefix, HashSet<int> prefixIndices,
32+
List<List<T>> result)
33+
{
34+
if (prefix.Count == r)
2835
{
29-
var permutations = Permutation.Find(combination, enableRepetition);
36+
result.Add(new List<T>(prefix));
37+
return;
38+
}
3039

31-
foreach(var permutation in permutations)
40+
for (int j = 0; j < input.Count; j++)
41+
{
42+
if (prefixIndices.Contains(j) && !enableRepetition)
3243
{
33-
result.Add(permutation);
44+
continue;
3445
}
35-
36-
}
3746

38-
return result;
47+
prefix.Add(input[j]);
48+
prefixIndices.Add(j);
49+
50+
Recurse(input, r, enableRepetition, prefix, prefixIndices, result);
51+
52+
prefix.RemoveAt(prefix.Count - 1);
53+
prefixIndices.Remove(j);
54+
}
3955
}
4056
}
4157
}

0 commit comments

Comments
 (0)