Рефакторинг (альтернативное решение c применение рекурсии) - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Решил задачу, но код получился слишком громоздким и осталось ощущение, что можно подобрать более элегантное решение с применением рекурсии. (Сам не сумел) Задача следующая: Есть карта с набором направлений куда идти: "NORTH", "SOUTH", "WEST", "EAST". Направления "NORTH" и "SOUTH" - противоположные направления, как и "WEST" и "EAST". Даны указания типа
string[] plan = { "NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST" };
Можно заметить, что "EAST", "WEST" - противоположные маршруты и можно остаться на месте. Таким образом весь маршрут сократиться до
string[] plan = { "WEST" }
Другой пример. Маршрут типа
string[] plan = {"NORTH", "SOUTH", "EAST", "WEST"}
сократиться до
string[] plan = {}
Но не все пути можно сократить, так например маршрут
string[] plan = {"NORTH", "WEST", "SOUTH", "EAST"}
не сокращаемый, т.к. "NORTH" и "WEST", "WEST" и "SOUTH", "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();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы