using System.Collections.Generic;
public static IEnumerable<int[]> GrayCodes(int length, int radix) {
throw new ArgumentOutOfRangeException(nameof(length));
throw new ArgumentOutOfRangeException(nameof(radix));
if (0 == length || 0 == radix)
int[] signs = Enumerable.Repeat(1, length).ToArray();
int[] current = new int[length];
for (bool keep = true; keep; ) {
yield return current.ToArray();
for (int i = current.Length - 1; i >= 0; --i) {
int d = current[i] + signs[i];
if (d >= 0 && d < radix) {
for (int j = i + 1; j < signs.Length; ++j)
public static void Main()
var report = string.Join(Environment.NewLine, GrayCodes(length, digits)
.Select(line => string.Join(" ", line)));
Console.WriteLine(report);
var flatten = string.Join(" ", GrayCodes(length, digits).SelectMany(g => g));