• Автор темы
  • #1

Braiker

Braiker

Здравствуйте уважаемые пользователи.
В этом уроке я хочу рассказать пр процесс называемый " Рекурсия ".
Постараюсь привести примеры и рассказать зачем и где используется.

Сначала немножечко углубимся в теорию.

Реку́рсия — процесс повторения элементов самоподобным образом. Например, если два зеркала установить одно напротив другого, то возникающие в них вложенные отражения — это одна из форм бесконечной рекурсии.

Термин «рекурсия» используется в различных специальных областях знаний — от лингвистики до логики, но наиболее широкое применение находит в математике и информатике. В математике и информатике рекурсия имеет отношение к методу определения функций: рекурсивно заданная функция в своём определении содержит саму себя, в частности, рекурсивной является функция, заданная рекуррентной формулой. Таким образом, можно одним выражением дать бесконечный набор способов вычисления функции, определить множество объектов через самого себя с использованием ранее заданных частных определений.

С рекурсией тесно связана математическая индукция: она является естественным способом доказательства свойств функций на натуральных числах, рекурсивно заданных через свои меньшие значения.

В программировании рекурсия — вызов функции (процедуры) из неё же самой, непосредственно (простая рекурсия) или через другие функции (сложная или косвенная рекурсия), например, функция A вызывает функцию B, а функция B — функцию A. Количество вложенных вызовов функции или процедуры называется глубиной рекурсии.

Преимущество рекурсивного определения объекта заключается в том, что такое конечное определение теоретически способно описывать бесконечно большое число объектов. С помощью рекурсивной программы же возможно описать бесконечное вычисление, причём без явных повторений частей программы.

Реализация рекурсивных вызовов функций в практически применяемых языках и средах программирования, как правило, опирается на механизм стека вызовов — адрес возврата и локальные переменные функции записываются в стек, благодаря чему каждый следующий рекурсивный вызов этой функции пользуется своим набором локальных переменных и за счёт этого работает корректно. Оборотной стороной этого довольно простого по структуре механизма является то, что на каждый рекурсивный вызов требуется некоторое количество оперативной памяти компьютера, и при чрезмерно большой глубине рекурсии может наступить переполнение стека вызовов. Вследствие этого, обычно рекомендуется избегать рекурсивных программ, которые приводят (или в некоторых условиях могут приводить) к слишком большой глубине рекурсии.

Возможно при компилировании мода вы могли заметить вот такое сообщение:
Пример:

Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase

Header size: 10228 bytes

Code size: 2389672 bytes

Data size: 7402676 bytes

Stack/heap size: 24000 bytes; estimated max. usage: unknown, due to recursion

Доброго времени суток.

Буду очень признателен вам, если поможете мне разобраться с конфигом MySQL.

[!!] Maximum possible memory usage: 67.4G (1744% of installed RAM)
На данный момент join_buffer_size = 256M, я не знаю, хорошо это или плохо, и не знаю, как мне выяснить, хватает ли этих 256M для каждого запроса, или это чрезмерно много?

max_connections = 256, кол-во максимальный соединений, я думаю, можно спокойно уменьшать до 64, ведь по статистике за 9 дней больше 47 соединений не было.

[!!] Joins performed without indexes: 142242
На данный момент я включил логирование запросов в которых не используются INDEX-ы. Есть ли какое-нибудь приложение, которое сможет проанализировать лог и выдать самый популярный запрос в котором не используется INDEX.

[!!] Query cache efficiency: 9.5% (703K cached / 7M selects)
На данный момент query_cache_limit — максимальный размер кэшируемого запроса равен 256M.
Получается, что в моем случае это мало? Нужно увеличивать?