Рекурсивные функции - зло

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
Для тех кто не знает что такое рекурсивная функция - это функция, обращающаяся сама к себе.
Пример:
C-подобный:
public void OnPluginStart()
{
    static int iter;
    if (3 <= iter)
        return;

    iter++;
    PrintToServer("iter: %d", iter);
    OnPluginStart();
}

В примере выше ничего плохого в рекурсии нет, так как static означает что переменная по факту будет глобальной, но что если в рекурсивной функции всё-таки будет выделение памяти? Это приведёт к постоянному выделению памяти, и высвободится она только в конце всех итераций. В SP нет динамической памяти, весь стек подсчитывается компилятором и выделяется виртуальной машиной заранее, поэтому рекурсия в SP приведёт к ошибке not enough stack/heap.

Отличие цикла от рекурсии:
C-подобный:
public void OnPluginStart()
{
    static int iter;
    while (iter <= 3)
    {
        iter++;
        int var1 = 0; // а ещё лучше делать объявление перед циклом, чтобы постоянно не выделять
        PrintToServer("sym: %d", var1 + iter);
        // высвобождение var1
    }
}
C-подобный:
public void OnPluginStart()
{
    static int iter;
    if (3 <= iter)
        return; // конец итераций

    iter++;
    int var1 = 0;
    PrintToServer("sym: %d", var1 + iter);
    OnPluginStart();
    // высвобождение var1 всех итераций
}

Вывод: вместо рекурсии пытайтесь делать циклы, особенно в SP.
Сообщения автоматически склеены:

Забыл уточнить: переменные удаляются в конце области видимости, поэтому в некоторых случаях можно создать новую, перед рекурсией (в примерах выше это реализуемо), но параметры функции высвобождаются исключительно в конце функции, поэтому с ними такие шутки не прокатят.
 
Последнее редактирование:

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Использование быстрой сортировки означает переход на сторону зла, получается.
Товарищи со светлой стороны, когда Ханойские башни достроите?
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
Использование быстрой сортировки означает переход на сторону зла, получается.
Товарищи со светлой стороны, когда Ханойские башни достроите?
Да, я знаю что в некоторых случаях избавиться от рекурсии невозможно. Поэтому если пишешь на SP - придётся выносить это в sm ext или костылить с #pragma dynamic (который только уменьшит шанс появления ошибки).
 
Сверху Снизу