Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2015, 19:07   #1
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию О рекурсивном вызове

Имеется код:

Код:
namespace Extension
{
    static class ExtensionClass
    {
        public static void ExtensionMethod(this string value, int counter)
        {
            counter--;
            Console.WriteLine(value + counter);

            if (counter != 0)
                value.ExtensionMethod(counter);

            Console.WriteLine(value + counter);
        }
    }

    class Program
    {
        static void Main()
        {
            string text = "Hello ";

            text.ExtensionMethod(3);

            // Delay.
            Console.ReadKey();
        }
    }
}
Тут, как видно, применяется рекурсивный вызов метода ExtensionMethod() самим себя.
То что он сам себя вызывает я понимаю. То что при заходе, когда я прогонял отладчиком код входим в сам метод ExtensionMethod() и сразу же убавляем на еденичку счётчик counter тоже понятно. И метод ExtensionMethod() выполняется т.к. вызывается рекурсивно, до тех пор, пока счётчик counter не станет равным 0.
Дальше как я понимаю отработает строка:
Код:
Console.WriteLine(value + counter);
И дальше условий для выполнения нет! А получается, что код каким-то загадочным образом отрабатывает так, что счётчик после того как прошёл от 3 до 0, прогоняется от 0 до 3.
Как такое вообще получается то?

Последний раз редактировалось Stilet; 07.11.2015 в 19:49.
hoz вне форума Ответить с цитированием
Старый 07.11.2015, 20:08   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так когда первый раз зашли в метод и вызвали "value.ExtensionMethod(counter) ", то что произойдет когда выполнится эта строка (когда завершится рекурсивно вызванный метод)?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.11.2015, 21:37   #3
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну так когда первый раз зашли в метод и вызвали "value.ExtensionMethod(counter) ", то что произойдет когда выполнится эта строка (когда завершится рекурсивно вызванный метод)?
Отработают данные поля:
PHP код:
counter--;
Console.WriteLine(value counter); 
Соответственно, счётчик counter уменьшится на 1 и выведется на консоль результат работы оператора:
PHP код:
Console.WriteLine(value counter); 
А дальше снова запустится:
PHP код:
value.ExtensionMethod(counter
hoz вне форума Ответить с цитированием
Старый 07.11.2015, 21:45   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я про последнюю строку из сообщения #3 спрашивал.
Что по вашему произойдет после выполнения этой строки?
И чем этот код отличается от
Код:
if (x != 0)
    DoSomething(x);
WriteLine(x);
?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.11.2015, 00:51   #5
hoz
Форумчанин
 
Аватар для hoz
 
Регистрация: 29.06.2013
Сообщений: 132
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Я про последнюю строку из сообщения #3 спрашивал.
Что по вашему произойдет после выполнения этой строки?
Ну, по логике, произойдёт выполнение метода public static void ExtensionMethod(this string value, int counter) с начала, от counter-- и до тех пор, пока не выскачет условие:
PHP код:
if (counter != 0
А тут уже отработка, если оно выполняется, иначе выполнится должно:
PHP код:
Console.WriteLine(value counter); 
А дальше выход. Я вижу так. Но на деле не так...
Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И чем этот код отличается от
Код:
if (x != 0)
    DoSomething(x);
WriteLine(x);
?
Ничем. Разве что вызов у Вас другого метода, а в предложенном мной варианте рекурсивно сам себя.
hoz вне форума Ответить с цитированием
Старый 08.11.2015, 01:12   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
иначе выполнится должно
Нету там никакого "иначе".

Ну так напишите если до сих пор непонятно:
Код:
            Console.WriteLine("before " + value + counter);

            if (counter != 0)
                value.ExtensionMethod(counter);

            Console.WriteLine("after " + value + counter);
или на Call Stack в отладчике помедитируйте.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 08.11.2015, 11:43   #7
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

про очередь и стек надо почитать.
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при вызове free() ivan.tiran Общие вопросы C/C++ 5 04.12.2014 23:01
Использование таймера в вызове фукнции morfei74 C# (си шарп) 0 16.12.2013 16:39
Ошибка при вызове openFileDialog ---FISHER--- C# (си шарп) 7 02.03.2011 13:25
Определить количество разбиения положительного целого числа и глубину рекурсии в рекурсивном алгоритме! hazk Общие вопросы C/C++ 1 05.12.2010 14:52