Актуально: ИТ-решение

Оборудование за 1 рубль

Позволяет корпоративным клиентам до 31 августа этого года приобрести оборудование для подключения к Интернету по мобильной сети оператора всего за 1 рубль.
Читайте подробности>>
 




White Papers

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

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

Мир ПК :: Студия программирования

Нерекурсивно о рекурсии

в buzz в мой мир в twitter версия для печатисохранить в pdf

Петр Курышев

Итерация свойственна человеку, а рекурсия — Богу.
Л. Питер Дойч

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

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

Звучит не очень понятно, но на практике все довольно просто. Хрестоматийный пример использования рекурсии — вычисление факториала. Факториал целого числа представляет собой последовательное произведение этого числа и всех целых чисел, которые меньше его. Факториал нуля — единица. Факториал от N равен N, умноженному на факториал N - 1 или Fact(N) = N * Fact(N - 1). Это пример рекурсивного определения. Есть и более сложные примеры: алгоритм вычисления функции Аккермана, алгоритм Жордана—Гаусса для решения системы линейных уравнений, алгоритм поиска наибольшего общего делителя.

Следующий листинг на языке программирования Си демонстрирует простую реализацию алгоритма вычисления факториала:

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

Использование рекурсии дает быстрый и наглядный результат. У рекурсии, однако, есть и «темная сторона».

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

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

Ниже приведен пример итеративной реализации алгоритма вычисления факториала:

Текст функции стал немного длиннее, и пропала наглядность, но теперь единственный возможный вид переполнения — это арифметическое переполнение, так как факториал от 13 уже не умещается в самое большое встроенное целое на 32-битном компьютере. Придется либо использовать типы, аналогичные int64, либо обращаться к математическим библиотекам повышенной точности, позволяющим оперировать действительно огромными числами. При итеративном подходе переполнение стека нам не угрожает: рекурсивный вызов заменяется циклом и не нужно «откладывать» текущую копию локальных переменных в стек.

Но не спешите списывать со счетов рекурсивную реализацию алгоритмов. Она пригодится в таких областях, как искусственный интеллект. Без рекурсии не обойтись при реализации генетических и метагенетических алгоритмов, используемых при построении систем, способных к обучению.

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

Кроме программирования рекурсия существует в математике, физике и даже лингвистике. Все геометрические фракталы задаются с помощью бесконечной рекурсии, а алгоритм решения задачи о Ханойских башнях на самом деле рекурсивный. Существуют даже рекурсивные аббревиатуры, например GNU: «GNU’s not Unix». Но это уже совершенно другая история.

21.10.2008г


Комментарии:


Для того, чтобы оставить комментарий авторизуйтесь или зарегистрируйтесь.

Новости ОСП-ТВ - 03.09.10


В номере

14/03/2002 №03

КОЛОНКА РЕДАКТОРА

С чем на отдых поедем?

Надеюсь, ваша работа позволит вам вырваться на недельку-другую отдохнуть. Для кого-то это будет отдых на природе, а кому-то милее пошататься по барам среди родных бетонных коробок. Но в любом случае вам пригодятся фотокамеры, обзор которых мы приготовили для вас в очередном «Хит-о-смотре».


Эта рубрика в архиве
Список номеров за



Инфозоны

В зоне партнерства Паладин Инвент и HP

Основные направления деятельности

«Паладин Инвент» предлагает своим клиентам решения на базе современных методов управления производством и бизнес-процессами.

HP Care Pack

HP Care Pack – это сервисный продукт HP, расширяющий условия стандартной гарантии в зависимости от требований бизнеса.

«Паладин Инвент» развивает экспертизу в области виртуализациии.

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

Система поддержки пользователей «Балтики»

Процессы управления ИТ-сервисами в пивоваренной компании «Балтика» специалисты «Паладин Инвент» реализовали на базе программного обеспечения HP Service Desk.

OSP.RU :: Написать письмо.