There is a big implementation of the algorithm that I am after here ( @lazy dog) . However, I need this in C #, and the conversion is not trivial due to the lack of C # yield from and possibly my own thickness.
Here is what I have now:
public static IEnumerable<ArrayList> sorted_k_partitions(int[] seq, int k) { var n = seq.Length; var groups = new ArrayList(); //a list of lists, currently empty IEnumerable<ArrayList> generate_partitions(int i) { if (i >= n) { // this line was the bug, was not creating a // deep clone of the list of lists // yield return new ArrayList(groups); yield return new ArrayList(groups.ToArray().Select(g => ((List<int>)g).ToList())); // Ugly but that is because we are using ArrayList // Using proper List<List<int>> cleans this up significantly } else { if (n - i > k - groups.Count) foreach (List<int> group in new ArrayList(groups)) { group.Add(seq[i]); // yield from generate_partitions(i + 1); foreach (var d in generate_partitions(i + 1)) { yield return d; } group.RemoveAt(group.Count - 1); } if (groups.Count < k) { groups.Add(new List<int> {seq[i]}); foreach (var d in generate_partitions(i + 1)) { // things start breaking down here, as this yield return // appears to release flow control and we then get the // yield return above. I have debuged this and the python // version and the python version does not do this. Very hard // to explain considering I don't fully understand it myself yield return d; } groups.RemoveAt(groups.Count - 1); } } } return generate_partitions(0); // don't worry about the sorting methods in the python // version, not needed }
Can anyone see any obvious errors, I'm sure my lack of understanding of Python yield from and coroutines hurt me.
Edit: error found, comments added above
source share