using System; using System.Collections.Generic; foreach (var (disk, fromPeg, toPeg) in Hanoi(3, 'A', 'C', 'B')) { Console.WriteLine($"Move disk {disk} from {fromPeg} to {toPeg}"); } // An iterator: each move is produced only when the loop above asks for the next one. static IEnumerable<(int Disk, char From, char To)> Hanoi(int n, char source, char target, char spare) { if (n == 0) { yield break; } foreach (var move in Hanoi(n - 1, source, spare, target)) { yield return move; } yield return (n, source, target); foreach (var move in Hanoi(n - 1, spare, target, source)) { yield return move; } }