Замена цикла while рекурсией - PullRequest
0 голосов
/ 19 февраля 2019

Быстрый и простой вопрос:

Является ли это:

private static void SetupConnection()
{
    try
    {
        TcpClient client = new TcpClient(myServer, myPort);
        //Do whatever...
    }
    catch (SocketException)
    {
        //Server is closed. Retry in 10 minutes.
        Thread.Sleep(600000);
        SetupConnection();
    }

жизнеспособной альтернативой этому:

private static void SetupConnection()
{
    while (true)
    {
        try
        {
            TcpClient client = new TcpClient(myServer, myPort);
            //Do whatever...
            break;
        }
        catch (SocketException)
        {
            //Server is closed. Retry in 10 minutes.
            Thread.Sleep(600000);
        }
    }
}

В то время как второй выглядит "чище", яМне все еще довольно любопытно, если первое тоже приемлемо, а если нет, то почему бы и нет?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Почему рекурсия плоха?

Вам нужно понять, что такое стек вызовов.

Это стек, который хранится в памяти.Каждый раз, когда вызывается новый метод, в этот стек добавляются ссылка и метод этого метода.Этот стек будет храниться в памяти (RAM).

При рекурсии, если вы продолжаете вызывать метод без каких-либо граничных условий, стек будет расти.

Через некоторое время он будет в состоянии, когда он не сможет принять какие-либо дополнительные записи, потому что недостаточно памяти для его хранения.

Вот тогда вы получите «Исключение переполнения стека».

Можем ли мы переписать каждый рекурсивный алгоритм без использования рекурсии?

Да, вы можете.Подход обычно называется «итеративный подход».

В каждом случае вы можете использовать вспомогательный стек / список / группу переменных - для хранения параметров, которые вы использовали в рекурсии.

Затем вы можете перебирать эти переменные, пока не достигнете граничного условия.

Таким образом, вы можете достичь того же результата, не вызывая ваш метод снова и снова.Всегда лучше использовать этот подход.

Тогда почему люди пишут рекурсивные алгоритмы?

Иногда рекурсивный алгоритм очень легко прочитать.Код итеративного подхода может быть непростым для чтения, и поэтому люди пытаются писать рекурсивный код много раз.

Вы можете решить, использовать ли итеративный или рекурсивный подход на основе двух вещей:

  • Входные выборки

  • Сопровождаемость кода

Если вы все еще хотите написать рекурсивный метод, НЕ забудьте добавить граничное условие, после которого рекурсия остановится.

Например,Код обхода дерева (предварительный порядок, порядок, последующий порядок) легче понять, если вы пишете рекурсивный алгоритм.Это будет хорошо работать, если у вас есть ограничение на количество узлов / уровней в дереве.Если вы уже знаете, что ваше дерево очень велико, возможно, вам стоит пойти на итеративный подход.

Надеюсь, это поможет вам лучше понять эти подходы.

0 голосов
/ 19 февраля 2019

Рекурсия в этом случае плоха, потому что если ваша программа выполняется слишком долго и соединение повторяется, вы в конечном итоге получите исключение StackOverflowException.

...