private static void GetBoardMovesFallSpringRecursive(Board originalBoard, BoardMove workingBoardMove, ILookup <MapNode, UnitMove> sourceNodeGroups, List <BoardMove> completedBoardMoves, int depth) { if (workingBoardMove.Count == sourceNodeGroups.Count) { completedBoardMoves.Add(workingBoardMove.Clone()); return; } MapNode node = sourceNodeGroups.First(n => !workingBoardMove.Sources.Contains(n.Key)).Key; foreach (UnitMove move in sourceNodeGroups[node]) { if (workingBoardMove.CurrentlyAllowsFallSpring(move)) { workingBoardMove.Add(move); GetBoardMovesFallSpringRecursive(originalBoard, workingBoardMove, sourceNodeGroups, completedBoardMoves, depth + 1); workingBoardMove.Remove(move); } } }