private static IEnumerable<IEnumerable<Tuple<int, int>>> GetRoutes(Triangle triangle, Tuple<int,int> startingPosition) { var positionsOnNextRow = triangle.GetPositionsOnNextRow(startingPosition).ToList(); if (!positionsOnNextRow.Any()) { yield return new[] {startingPosition}; yield break; } foreach (var nextPosition in positionsOnNextRow) { foreach (var route in GetRoutesMemo(triangle, nextPosition)) { yield return route.Concat(new[] {startingPosition}); } } }