Рефакторинг (альтернативное решение c применение рекурсии) - C#
Формулировка задачи:
Здравствуйте. Решил задачу, но код получился слишком громоздким и осталось ощущение, что можно подобрать более элегантное решение с применением рекурсии. (Сам не сумел)
Задача следующая: Есть карта с набором направлений куда идти: "NORTH", "SOUTH", "WEST", "EAST". Направления "NORTH" и "SOUTH" - противоположные направления, как и "WEST" и "EAST".
Даны указания типа Можно заметить, что "EAST", "WEST" - противоположные маршруты и можно остаться на месте. Таким образом весь маршрут сократиться до Другой пример. Маршрут типа сократиться до Но не все пути можно сократить, так например маршрут не сокращаемый, т.к. "NORTH" и "WEST", "WEST" и "SOUTH", "SOUTH" и "EAST" не противоположные.
Вот мое решение:
Все решение не прошу выкладывать, подскажите только как правильно организовать рекурсию для данной задачи.
string[] plan = { "NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST" };
string[] plan = { "WEST" }
string[] plan = {"NORTH", "SOUTH", "EAST", "WEST"}
string[] plan = {}
string[] plan = {"NORTH", "WEST", "SOUTH", "EAST"}
public static string[] dirReduc(String[] arr) { if (arr.Length == 0) return null; string[] a = new string[arr.Length]; string[] b = new string[arr.Length]; for (int i = 0; i < arr.Length; i++) b[i] = arr[i]; int count = 0, c = arr.Length; for (int j = 0; j < 1 + arr.Length / 2; j++) { count = 0; for (int i = 0; i <= c - 1; i++) { if (i == c - 1) { a[count] = b[i]; count++; } else if (((b[i] == "WEST" & b[i + 1] == "EAST") | (b[i] == "EAST" & b[i + 1] == "WEST"))) i++; else if ((b[i] == "SOUTH" & b[i + 1] == "NORTH") | (b[i] == "NORTH" & b[i + 1] == "SOUTH")) i++; else { a[count] = b[i]; count++; if (i == c - 2) { a[count] = b[c - 1]; count++; i++; } } } for (int i = 0; i < count; i++) { b[i] = a[i]; } c = count; } string []d = new string[c]; for (int i = 0; i < c; i++) d[i] = b[i]; return d; }
Решение задачи: «Рефакторинг (альтернативное решение c применение рекурсии)»
textual
Листинг программы
public string[] Truncate(string[] way) { const string NORTH = "NORTH"; const string SOUTH = "SOUTH"; const string EAST = "EAST"; const string WEST = "WEST"; Stack<string> stack = new Stack<string>(); foreach (string direction in way) { if (stack.Count == 0) { stack.Push(direction); } else { string topStack = stack.Peek(); if (topStack == NORTH && direction == SOUTH || topStack == SOUTH && direction == NORTH || topStack == EAST && direction == WEST || topStack == WEST && direction == EAST) { stack.Pop(); } else { stack.Push(direction); } } } return stack.ToArray(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д