DeathScore13
пирожок. пирожочек.
- Сообщения
- 734
- Реакции
- 403
Для тех кто не знает что такое рекурсивная функция - это функция, обращающаяся сама к себе.
Пример:
В примере выше ничего плохого в рекурсии нет, так как
Отличие цикла от рекурсии:
Вывод: вместо рекурсии пытайтесь делать циклы, особенно в SP.
Забыл уточнить: переменные удаляются в конце области видимости, поэтому в некоторых случаях можно создать новую, перед рекурсией (в примерах выше это реализуемо), но параметры функции высвобождаются исключительно в конце функции, поэтому с ними такие шутки не прокатят.
Пример:
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.
Сообщения автоматически склеены:
Забыл уточнить: переменные удаляются в конце области видимости, поэтому в некоторых случаях можно создать новую, перед рекурсией (в примерах выше это реализуемо), но параметры функции высвобождаются исключительно в конце функции, поэтому с ними такие шутки не прокатят.
Последнее редактирование: