@missbells

Почему рекурсия не прерывается после выполнения условия остановки?

Когда прохожусь в VS по коду поэтотапно, то вижу следующую картину..., которая для меня вообще неясна: почему после выполнения условия остановки рекурсии if (path.Count == pathLength+1) программа перескакивает сначала в конец функции, а потом переходит четко на рекурсию, обходя даже цикл for, в который она вложена

5ac7884f8ea36667004195.jpeg

Более детально:
Пытаюсь рекурсивно пройтись по матрице смежности графа и найти пути длиной 2 (т.е. пути, которые проходят через 3 точки). В данном примере ищу пути, который стартуют из вершины графа под номером 3 (3я строчка матрицы).
Я считаю, что написанная мной функция, должна выдать мне путь 3-1-5, поскольку никакой проверки на остальные единицы в ряду я не писала. Но вместо этого функция после нахождения этого пути снова переходит к рекурсии.. не могу понять, почему так происходит. Подскажите, пожалуйста, почему?

Код:

namespace Lab4{

    class Program
    {
        public static int v = 8;
        public static int pathLength = 2;
        public static List<int> path = new List<int>();

        public static int[,] matrix = {
                { 0, 0, 0, 0, 1, 0, 0, 0 },
                { 1, 0, 0, 0, 0, 0, 0, 0 },
                { 1, 1, 0, 0, 0, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 1, 0 },
                { 0, 0, 0, 1, 0, 0, 0, 0 },
                { 0, 0, 0, 0, 1, 0, 0, 0 },
                { 0, 0, 0, 0, 0, 1, 0, 0 },
                { 0, 0, 0, 0, 0, 0, 1, 0 }
            };
        
        public static void recursion(int row)
        {
            if (path.Count == pathLength+1)
            {
                for (int k = 0; k < path.Count; k++)
                {
                    Console.Write(path[k] + " ");
                }
                Console.ReadKey();
            }
            else
            {
                for (int j = 0; j < v; j++)
                {
                   if (matrix[row,j] == 1)
                   {
                        path.Add(row+1);
                        recursion(j);
                   }  
                }
            }
        }
        static void Main(string[] args) {
            recursion(2);
            Console.ReadLine();          
        }
    }
}
  • Вопрос задан
  • 193 просмотра
Пригласить эксперта
Ответы на вопрос 1
@cicatrix
было бы большой ошибкой думать
Хинт: гляньте на стэк вызовов. Вы выходите из функции и "поднимаетесь вверх" на уровень выше.
То есть, ранее вы вошли рекурсивно в функцию recursion, затем она отработала и вышла на фрейм выше.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы