Рефакторинг (альтернативное решение 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();
}