public int GetNumPossibilities(int current, ImmutableSequence<int> possibilities) { if (current == 0) { return 1; } ImmutableSequence<int> otherPossibilities = possibilities.Skip(1); int possibility = possibilities.First(); if (!otherPossibilities.HasValue) { if ((current % possibility) == 0) { return 1; } else { return 0; } } return new Range(current, 0, -possibility, true) .Sum(n => GetNumPossibilities(n, otherPossibilities)); }
public IEnumerable<IEnumerable<int>> GetResults(BooleanMatrix pairs, int count, ImmutableSequence<int> current) { int length = pairs.Width; int start; if (!current.HasValue) { start = 0; } else { start = current.First(); } var results = new Range(start, length) .Where(i => current .All(x => pairs[x, i])); if (count == 1) { return results .Select(i => new ImmutableSequence<int>(i, current)); } else { return results .SelectMany(i => GetResults(pairs, count - 1, new ImmutableSequence<int>(i, current))); } }