Содержание

Рекурсивный алгоритм | это… Что такое Рекурсивный алгоритм?

Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи.

Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.

Определение в логике, использующее рекурсию, называется индуктивным (см., например, Натуральное число).

Содержание

  • 1 Примеры
  • 2 Рекурсия в программировании
    • 2.1 Функции
    • 2.2 Данные
  • 3 Рекурсия в физике
  • 4 Рекурсия в лингвистике
  • 5 Цитаты
  • 6 Юмор
  • 7 См. также
  • 8 Ссылки

Примеры

  • Метод Гаусса — Жордана для решения Системы линейных алгебраических уравнений является рекурсивным.
  • Факториал целого неотрицательного числа n обозначается n! и определяется как
    при n > 0 и n! = 1 при n = 0
  • Числа Фибоначчи определяются с помощью рекуррентного соотношения:
    Первое и второе числа Фибоначчи равны 1
    Для n > 2, ne число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи
  • Практически все геометрические фракталы задаются в форме бесконечной рекурсии. (например, треугольник Серпинского).
  • Задача «Ханойские башни». Её содержательная постановка такова:
    В одном из буддийских монастырей монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
    Рекурсивный вариант решения задачи можно описать так:

Алгоритм по передвижению башни, алгоритм передвинет нужное количество дисков из пирамиды «источник» на пирамиду «задание» используя «запасную» пирамиду.

Если число дисков равно одному, тогда:

  • Передвиньте диск из источника в задание

В противном случае:

  • Рекурсивно передвиньте все диски кроме одного из источника в запас, используя задание как запас
  • Передвиньте оставшийся диск из источника в задание
  • Передвиньте все диски из запаса в задание используя источник как запас

Рекурсия в программировании

Функции

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

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

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

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

Впрочем, имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивают выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. К сожалению, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Lisp), описание которого содержит все необходимые сведения.

  • См. также Примеры реализации функции факториал

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

 class element_of_list
 {
   element_of_list *next; /* ссылка на следующий элемент того же типа */
   int data; /* некие данные */
 };

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

Рекурсия в физике

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

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

Рекурсия в лингвистике

Способность языка порождать вложенные предложения и конструкции. Базовое предложение

кошка съела мышь может быть за счет рекурсии расширено как Ваня догадался, что кошка съела мышь, далее как Катя знает, что Ваня догадался, что кошка съела мышь и так далее. Рекурсия считается одной из лингвистических универсалий, то есть свойственна любому естественному языку (хотя в последнее время активно обсуждается возможное отсутствие рекурсии в одном из языков Амазонии — пираха, которое отмечает лингвист Д. Эверетт). О рекурсии в лингвистике, ее разновидностях и наиболее характерных проявлениях в русском языке описано в статье Е.А.Лодатко «Рекурсивные лингвистические структуры» (см.: Рекурсивные лингвистические структуры)

Цитаты

Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч[1]

Юмор

Большая часть всех шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода. Известные высказывания: ‘Чтобы понять рекурсию, нужно сначала понять рекурсию’, ‘Чтобы что-то сделать, надо что-то сделать’, ‘Для приготовления салата необходимы: огурцы, помидоры, салат’. Весьма популярна шутка о рекурсии, напоминающая словарную статью:

рекурсия 
см.
рекурсия

Несколько рассказов Станислава Лема посвящены (возможным) казусам при бесконечной рекурсии:

  • Рассказ про Йона Тихого «Путешествие четырнадцатое» из «Звёздных дневников Ийона Тихого», в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки».
  • Рассказ о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную, и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей).

Русская народная сказка-песня «У попа была собака…» являет пример рекурсии:

У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

См.

также
  • Индукция
  • Математическая индукция
  • Корекурсия
  • Рекуррентная последовательность (возвратная последовательность)

Ссылки

  1. * Дональд Кнут Искусство программирования, том 1. Основные алгоритмы = The Art of Computer Programming, vol.1. Fundamental Algorithms. — 3-е изд. — М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1

Рекурсивный алгоритм | это… Что такое Рекурсивный алгоритм?

Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи.

Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.

Определение в логике, использующее рекурсию, называется индуктивным (см., например, Натуральное число).

Содержание

  • 1 Примеры
  • 2 Рекурсия в программировании
    • 2.1 Функции
    • 2.2 Данные
  • 3 Рекурсия в физике
  • 4 Рекурсия в лингвистике
  • 5 Цитаты
  • 6 Юмор
  • 7 См. также
  • 8 Ссылки

Примеры

  • Метод Гаусса — Жордана для решения Системы линейных алгебраических уравнений является рекурсивным.
  • Факториал целого неотрицательного числа n обозначается n! и определяется как
    при n > 0 и n! = 1 при n = 0
  • Числа Фибоначчи определяются с помощью рекуррентного соотношения:
    Первое и второе числа Фибоначчи равны 1
    Для n > 2, ne число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи
  • Практически все геометрические фракталы задаются в форме бесконечной рекурсии. (например, треугольник Серпинского).
  • Задача «Ханойские башни». Её содержательная постановка такова:
    В одном из буддийских монастырей монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
    Рекурсивный вариант решения задачи можно описать так:

Алгоритм по передвижению башни, алгоритм передвинет нужное количество дисков из пирамиды «источник» на пирамиду «задание» используя «запасную» пирамиду.

Если число дисков равно одному, тогда:

  • Передвиньте диск из источника в задание

В противном случае:

  • Рекурсивно передвиньте все диски кроме одного из источника в запас, используя задание как запас
  • Передвиньте оставшийся диск из источника в задание
  • Передвиньте все диски из запаса в задание используя источник как запас

Рекурсия в программировании

Функции

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

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

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

Впрочем, имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивают выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. К сожалению, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Lisp), описание которого содержит все необходимые сведения.

  • См. также Примеры реализации функции факториал

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

 class element_of_list
 {
   element_of_list *next; /* ссылка на следующий элемент того же типа */
   int data; /* некие данные */
 };

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

Рекурсия в физике

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

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

Рекурсия в лингвистике

Способность языка порождать вложенные предложения и конструкции. Базовое предложение кошка съела мышь может быть за счет рекурсии расширено как Ваня догадался, что кошка съела мышь, далее как Катя знает, что Ваня догадался, что кошка съела мышь и так далее. Рекурсия считается одной из лингвистических универсалий, то есть свойственна любому естественному языку (хотя в последнее время активно обсуждается возможное отсутствие рекурсии в одном из языков Амазонии — пираха, которое отмечает лингвист Д. Эверетт). О рекурсии в лингвистике, ее разновидностях и наиболее характерных проявлениях в русском языке описано в статье Е.А.Лодатко «Рекурсивные лингвистические структуры» (см.: Рекурсивные лингвистические структуры)

Цитаты

Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч[1]

Юмор

Большая часть всех шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода. Известные высказывания: ‘Чтобы понять рекурсию, нужно сначала понять рекурсию’, ‘Чтобы что-то сделать, надо что-то сделать’, ‘Для приготовления салата необходимы: огурцы, помидоры, салат’. Весьма популярна шутка о рекурсии, напоминающая словарную статью:

рекурсия 
см. рекурсия

Несколько рассказов Станислава Лема посвящены (возможным) казусам при бесконечной рекурсии:

  • Рассказ про Йона Тихого «Путешествие четырнадцатое» из «Звёздных дневников Ийона Тихого», в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки».
  • Рассказ о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную, и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей).

Русская народная сказка-песня «У попа была собака…» являет пример рекурсии:

У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

См.

также
  • Индукция
  • Математическая индукция
  • Корекурсия
  • Рекуррентная последовательность (возвратная последовательность)

Ссылки

  1. * Дональд Кнут Искусство программирования, том 1. Основные алгоритмы = The Art of Computer Programming, vol.1. Fundamental Algorithms. — 3-е изд. — М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1

Рекурсивный алгоритм | это… Что такое Рекурсивный алгоритм?

Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи.

Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.

Определение в логике, использующее рекурсию, называется индуктивным (см., например, Натуральное число).

Содержание

  • 1 Примеры
  • 2 Рекурсия в программировании
    • 2.1 Функции
    • 2.2 Данные
  • 3 Рекурсия в физике
  • 4 Рекурсия в лингвистике
  • 5 Цитаты
  • 6 Юмор
  • 7 См. также
  • 8 Ссылки

Примеры

  • Метод Гаусса — Жордана для решения Системы линейных алгебраических уравнений является рекурсивным.
  • Факториал целого неотрицательного числа n обозначается n! и определяется как
    при n > 0 и n! = 1 при n = 0
  • Числа Фибоначчи определяются с помощью рекуррентного соотношения:
    Первое и второе числа Фибоначчи равны 1
    Для n > 2, ne число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи
  • Практически все геометрические фракталы задаются в форме бесконечной рекурсии. (например, треугольник Серпинского).
  • Задача «Ханойские башни». Её содержательная постановка такова:
    В одном из буддийских монастырей монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
    Рекурсивный вариант решения задачи можно описать так:

Алгоритм по передвижению башни, алгоритм передвинет нужное количество дисков из пирамиды «источник» на пирамиду «задание» используя «запасную» пирамиду.

Если число дисков равно одному, тогда:

  • Передвиньте диск из источника в задание

В противном случае:

  • Рекурсивно передвиньте все диски кроме одного из источника в запас, используя задание как запас
  • Передвиньте оставшийся диск из источника в задание
  • Передвиньте все диски из запаса в задание используя источник как запас

Рекурсия в программировании

Функции

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

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

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

Впрочем, имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивают выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. К сожалению, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Lisp), описание которого содержит все необходимые сведения.

  • См. также Примеры реализации функции факториал

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

 class element_of_list
 {
   element_of_list *next; /* ссылка на следующий элемент того же типа */
   int data; /* некие данные */
 };

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

Рекурсия в физике

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

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

Рекурсия в лингвистике

Способность языка порождать вложенные предложения и конструкции. Базовое предложение кошка съела мышь может быть за счет рекурсии расширено как Ваня догадался, что кошка съела мышь, далее как Катя знает, что Ваня догадался, что кошка съела мышь и так далее. Рекурсия считается одной из лингвистических универсалий, то есть свойственна любому естественному языку (хотя в последнее время активно обсуждается возможное отсутствие рекурсии в одном из языков Амазонии — пираха, которое отмечает лингвист Д. Эверетт). О рекурсии в лингвистике, ее разновидностях и наиболее характерных проявлениях в русском языке описано в статье Е.А.Лодатко «Рекурсивные лингвистические структуры» (см.: Рекурсивные лингвистические структуры)

Цитаты

Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч[1]

Юмор

Большая часть всех шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода. Известные высказывания: ‘Чтобы понять рекурсию, нужно сначала понять рекурсию’, ‘Чтобы что-то сделать, надо что-то сделать’, ‘Для приготовления салата необходимы: огурцы, помидоры, салат’. Весьма популярна шутка о рекурсии, напоминающая словарную статью:

рекурсия 
см. рекурсия

Несколько рассказов Станислава Лема посвящены (возможным) казусам при бесконечной рекурсии:

  • Рассказ про Йона Тихого «Путешествие четырнадцатое» из «Звёздных дневников Ийона Тихого», в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки».
  • Рассказ о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную, и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей).

Русская народная сказка-песня «У попа была собака…» являет пример рекурсии:

У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

См.

также
  • Индукция
  • Математическая индукция
  • Корекурсия
  • Рекуррентная последовательность (возвратная последовательность)

Ссылки

  1. * Дональд Кнут Искусство программирования, том 1. Основные алгоритмы = The Art of Computer Programming, vol.1. Fundamental Algorithms. — 3-е изд. — М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1

Рекурсивный алгоритм | это… Что такое Рекурсивный алгоритм?

Реку́рсия — метод определения класса объектов или методов предварительным заданием одного или нескольких (обычно простых) его базовых случаев или методов, а затем заданием на их основе правила построения определяемого класса, ссылающегося прямо или косвенно на эти базовые случаи.

Другими словами, рекурсия — способ общего определения объекта или действия через себя, с использованием ранее заданных частных определений. Рекурсия используется, когда можно выделить самоподобие задачи.

Определение в логике, использующее рекурсию, называется индуктивным (см., например, Натуральное число).

Содержание

  • 1 Примеры
  • 2 Рекурсия в программировании
    • 2.1 Функции
    • 2.2 Данные
  • 3 Рекурсия в физике
  • 4 Рекурсия в лингвистике
  • 5 Цитаты
  • 6 Юмор
  • 7 См. также
  • 8 Ссылки

Примеры

  • Метод Гаусса — Жордана для решения Системы линейных алгебраических уравнений является рекурсивным.
  • Факториал целого неотрицательного числа n обозначается n! и определяется как
    при n > 0 и n! = 1 при n = 0
  • Числа Фибоначчи определяются с помощью рекуррентного соотношения:
    Первое и второе числа Фибоначчи равны 1
    Для n > 2, ne число Фибоначчи равно сумме (n − 1)-го и (n − 2)-го чисел Фибоначчи
  • Практически все геометрические фракталы задаются в форме бесконечной рекурсии. (например, треугольник Серпинского).
  • Задача «Ханойские башни». Её содержательная постановка такова:
    В одном из буддийских монастырей монахи уже тысячу лет занимаются перекладыванием колец. Они располагают тремя пирамидами, на которых надеты кольца разных размеров. В начальном состоянии 64 кольца были надеты на первую пирамиду и упорядочены по размеру. Монахи должны переложить все кольца с первой пирамиды на вторую, выполняя единственное условие — кольцо нельзя положить на кольцо меньшего размера. При перекладывании можно использовать все три пирамиды. Монахи перекладывают одно кольцо за одну секунду. Как только они закончат свою работу, наступит конец света.
    Рекурсивный вариант решения задачи можно описать так:

Алгоритм по передвижению башни, алгоритм передвинет нужное количество дисков из пирамиды «источник» на пирамиду «задание» используя «запасную» пирамиду.

Если число дисков равно одному, тогда:

  • Передвиньте диск из источника в задание

В противном случае:

  • Рекурсивно передвиньте все диски кроме одного из источника в запас, используя задание как запас
  • Передвиньте оставшийся диск из источника в задание
  • Передвиньте все диски из запаса в задание используя источник как запас

Рекурсия в программировании

Функции

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

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

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

Впрочем, имеется специальный тип рекурсии, называемый «хвостовой рекурсией». Интерпретаторы и компиляторы функциональных языков программирования, поддерживающие оптимизацию кода (исходного и/или исполняемого), автоматически преобразуют хвостовую рекурсию к итерации, благодаря чему обеспечивают выполнение алгоритмов с хвостовой рекурсией в ограниченном объёме памяти. Такие рекурсивные вычисления, даже если они формально бесконечны (например, когда с помощью рекурсии организуется работа командного интерпретатора, принимающего команды пользователя), никогда не приводят к исчерпанию памяти. К сожалению, далеко не всегда стандарты языков программирования чётко определяют, каким именно условиям должна удовлетворять рекурсивная функция, чтобы транслятор гарантированно преобразовал её в итерацию. Одно из редких исключений — язык Lisp), описание которого содержит все необходимые сведения.

  • См. также Примеры реализации функции факториал

Данные

Описание типа данных может содержать ссылку на саму себя. Подобные структуры используются при описании списков и графов. Пример описания списка (C++):

 class element_of_list
 {
   element_of_list *next; /* ссылка на следующий элемент того же типа */
   int data; /* некие данные */
 };

Рекурсивная структура данных зачастую обуславливает применение рекурсии для обработки этих данных.

Рекурсия в физике

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

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

Рекурсия в лингвистике

Способность языка порождать вложенные предложения и конструкции. Базовое предложение кошка съела мышь может быть за счет рекурсии расширено как Ваня догадался, что кошка съела мышь, далее как Катя знает, что Ваня догадался, что кошка съела мышь и так далее. Рекурсия считается одной из лингвистических универсалий, то есть свойственна любому естественному языку (хотя в последнее время активно обсуждается возможное отсутствие рекурсии в одном из языков Амазонии — пираха, которое отмечает лингвист Д. Эверетт). О рекурсии в лингвистике, ее разновидностях и наиболее характерных проявлениях в русском языке описано в статье Е.А.Лодатко «Рекурсивные лингвистические структуры» (см.: Рекурсивные лингвистические структуры)

Цитаты

Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч[1]

Юмор

Большая часть всех шуток о рекурсии касается бесконечной рекурсии, в которой нет условия выхода. Известные высказывания: ‘Чтобы понять рекурсию, нужно сначала понять рекурсию’, ‘Чтобы что-то сделать, надо что-то сделать’, ‘Для приготовления салата необходимы: огурцы, помидоры, салат’. Весьма популярна шутка о рекурсии, напоминающая словарную статью:

рекурсия 
см. рекурсия

Несколько рассказов Станислава Лема посвящены (возможным) казусам при бесконечной рекурсии:

  • Рассказ про Йона Тихого «Путешествие четырнадцатое» из «Звёздных дневников Ийона Тихого», в котором герой последовательно переходит от статьи о сепульках к статье о сепуляции, оттуда к статье о сепулькариях, в которой снова стоит отсылка к статье «сепульки».
  • Рассказ о разумной машине, которая обладала достаточным умом и ленью, чтобы для решения поставленной задачи построить себе подобную, и поручить решение ей (итогом стала бесконечная рекурсия, когда каждая новая машина строила себе подобную и передавала задание ей).

Русская народная сказка-песня «У попа была собака…» являет пример рекурсии:

У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:
«У попа была собака, он её любил,
Она съела кусок мяса, он её убил,
В землю закопал,
Надпись написал:

См.

также
  • Индукция
  • Математическая индукция
  • Корекурсия
  • Рекуррентная последовательность (возвратная последовательность)

Ссылки

  1. * Дональд Кнут Искусство программирования, том 1. Основные алгоритмы = The Art of Computer Programming, vol.1. Fundamental Algorithms. — 3-е изд. — М.: «Вильямс», 2006. — С. 720. — ISBN 0-201-89683-4
  • Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1

Рекурсивные алгоритмы

Определение 1

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

Рекурсивные алгоритмы

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

Замечание 1

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

Рекурсию возможно применять, когда есть возможность выделения подобной самой себе задачи. В качестве примера можно привести задачу «Ханойские башни». Она содержит следующую постановку задачи. Монахи одного из буддийских монастырей перекладывают кольца в течение примерно уже тысячи лет. У них есть три пирамиды, на которые одеты кольца различных размерных величин. Изначально шестьдесят четыре кольца располагались надетыми на первую из пирамид в порядке убывания их размеров. Задачей монахов было перекладывание всех колец с исходной пирамиды на следующую, при соблюдении одного условия, перекладываемое кольцо не допускается класть на кольцо, размеры которого меньше. При операции перемещения колец допускается использование всех трёх пирамид. Скорость перекладывания колец монахами составляет одно кольцо в секунду. Когда они завершат свою задачу, придёт конец света. В рекурсивном варианте решение задачи будет выглядеть следующим образом. Алгоритм перемещения башни переместит необходимое число колец из пирамиды «источника» на пирамиду «приёмник» применяя «запас» в виде третьей пирамиды. При количестве колец равном одному, алгоритм будет следующим: переместите кольцо из источника в приёмник. Конец.

Если число колец больше:

  1. Используя рекурсию переместите все кольца, за исключением одного, из источника в запас, применяя приёмник в качестве запаса.
  2. Переместите последнее кольцо из источника в приёмник.
  3. Переместите все кольца из запаса в приёмник, применяя источник в качестве запаса.

Рекурсивные алгоритмы в программировании

Определение 2

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

К примеру программная функция А обращается к функции В, а функция В обращается к функции А. Число вложенных обращений к функциям или процедурам следует называть глубиной рекурсии.

Замечание 2

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

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

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

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

Рекурсивные алгоритмы в других областях

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

Рекурсивные алгоритмы присутствуют также в области лингвистики. Это, например, могут быть языковые возможности создавать вложенные конструкции и предложения. Например, исходное предложение «кошка поймала мышь» можно расширить, применяя рекурсивный алгоритм, до «Вася понял, что кошка поймала мышь». Затем «Лиза узнала, что Вася понял, что кошка поймала мышь» и так можно продолжать бесконечно. Рекурсивный алгоритм можно считать универсальным лингвистическим методом, который есть в любом естественном языке. Но существует мнение, что в некоторых языках Амазонии свойство рекурсии не заложено изначально.

Рекурсия – жемчужина теории алгоритмов — Scratch

ВИКТОР КОХОВЕЦ
учитель информатики и математики Валищенской средней школы Пинского района

В информатике в понятие «рекурсия» вкладывается следующий смысл: это прием программирования, при котором подпрограмма вызывает саму себя либо непосредственно, либо косвенно.

Звучит просто, но, как только мы начинаем знакомиться с ней или знакомить наших наиболее способных учеников, появляется много вопросов и проблем: что, зачем и как это вообще работает?

Зачем это нужно?

Так зачем же нужна рекурсия? Нельзя ли обойтись без нее? Есть ли у нее преимущества в сравнении с более простыми и доступными для понимания приемами?

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

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

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

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

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

Как это работает?

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

Уже начиная с версии 2.0 в Scratch появилась возможность использовать рекурсивный вызов блока «Другие блоки». Давайте посмотрим, как с его помощью можно легко разобраться в принципах организации и работы рекурсивных алгоритмов.

Иногда для того, чтобы понять, как необходимо действовать правильно, стоит рассмотреть противоположный случай и сделать неправильно. Сейчас мы поступим именно так. Рассмотрим элементарный алгоритм, в котором реализован рекурсивный вызов: «Пример неправильного рекурсивного алгоритма» .



Несомненно, что этот алгоритм является рекурсивным, так как в подпрограмме «Следующий шаг» есть вызов ее же самой. Запустив скрипт, мы увидим, что кот бесконечно «ходит» по сторонам квадрата и, когда он делает следующий шаг, переменная «Глубина рекурсии» увеличивается на единицу.

Самое интересное начнется, если мы включим Турборежим (Редактировать / Включить Турборежим) и откроем вкладку Процессы в Диспетчере задач Windows (Ctrl+Alt+Del / Диспетчер задач / Подробнее). Там мы сможем увидеть, что с каждой секундой объем памяти, занимаемый браузером, возрастает. Если не прервать выполнение программы, то ресурсы системы будут исчерпаны и работа завершится аварийно. У меня на глубине рекурсии около 10 миллионов вкладка с проектом стала занимать больше 2 Гб оперативной памяти, а затем прекратила работу:


Этот пример показывает, что каждый вызов рекурсии занимает дополнительную память на хранение стека вызовов, хотя и расходует ее довольно экономно. Безусловно, в таком виде использовать рекурсию нельзя!

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

Фрактальное дерево

Давайте рассмотрим, как это работает, на примере алгоритма рисования фрактального дерева.

Мы будем двигаться от простого к сложному и начнем с рисования простейшей части дерева – ветки. Создадим новую подпрограмму с помощью блока «Другие блоки». Назовем ее «Дерево1» и будем передавать в нее длину рисуемой ветки. Никакой рекурсии – опускаем перо и делаем 50 шагов вперед и столько же назад.


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


Движемся дальше – блок «Дерево3». На третьем уровне снова рисуем прямую линию и отходящие от нее два дерева, но уже не первого, а второго уровня, опять же используя уже созданные подпрограммы. Снова никакой рекурсии, все обычно и просто, но мы уже начинаем видеть дерево.


Понятно, что этот процесс можно продолжить и создать подпрограммы «Дерево4», «Дерево5», «Дерево6» и так далее, получая с каждым шагом все более интересные рисунки.

Но зачем делать много новых скриптов? Легко можно заметить, что «Дерево2» и «Дерево3» отличаются друг от друга только цифрами в названиях процедур. Давайте добавим в определение блока еще один параметр – «Уровень» – и при вызове блока «Дерево» будем уменьшать его на единицу. Также необходимо заметить, что блок «Дерево1» не вызывал никаких других блоков, поэтому этот случай в новом блоке рассмотрен отдельно.


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

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


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

Задача о ханойских башнях

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

В одной из древних легенд говорится следующее. «В храме Бенареса находится бронзовая плита с тремя алмазными стержнями. На один из стержней Бог при сотворении мира нанизал 64 диска разного диаметра из чистого золота так, что наибольший диск лежит на бронзовой плите, а остальные образуют пирамиду, сужающуюся кверху. Это башня Брамы. Работая день и ночь, жрецы переносят диски с одного стержня на другой, следуя законам Брамы:

1. Диски можно перемещать с одного стержня на другой только по одному;

2. Нельзя класть больший диск на меньший.

Когда все 64 диска будут перенесены с одного стержня на другой, и башня, и храмы, и жрецы-брамины превратятся в прах, и наступит конец света».

Эта древняя легенда породила задачу о ханойских башнях: переместить m дисков с одного из трех стержней на другой, соблюдая «законы Брамы».

Пронумеруем стержни слева направо от 1 до 3. Задача состоит в переносе m дисков с левого стержня на правый.


Задача может быть решена одним перемещением только для одного (m = 1) диска. В общем случае потребуется минимум  перемещение.

Построим математическое рекурсивное решение задачи, состоящее из трех этапов:

1. Перенести башню, состоящую из m – 1 диска, со стержня № 1 на стержень № 2;

2. Перенести один оставшийся диск со стержня № 1 на стержень № 3;

3. Перенести башню, состоящую из m – 1 диска, со стержня № 2 на стержень № 3.

Таким образом, задача о перемещении m дисков сводится к задаче о перемещении m – 1 диска. Обращаясь опять к этому же алгоритму, сведем задачу к перемещению m – 2 дисков. Продолжая этот процесс, получим в конце концов задачу о перемещении одного диска. Эта задача решается за один ход. Таким образом, в процессе решения возникают промежуточные задачи: переместить башню из нескольких n дисков с одного стержня на другой.

Обозначим тот стержень, с которого следует снять диски, через i1, а тот, на который надеть, через i2. Тогда номер вспомогательного стержня равен 6 – i1 – i2.

Оформим алгоритм решения задачи о переносе башни из n дисков с i1 на i2 в виде нового блока с тремя параметрами: n, i1, i2:


Решение задачи о ханойских башнях доступно на сайте Scratch по ссылке https://scratch.mit.edu/projects/190497395/.

Помимо текстового решения там размещены анимированные реализации, которые представляют собой игры-головоломки. Они позволяют попробовать решить задачу самому, а затем сравнить свое решение с решением компьютера: https://scratch.mit.edu/projects/217088119/ и https://scratch. mit.edu/projects/190485662/.

Все использованные в статье проекты собраны встудию «Рекурсия в Scratch»: https://scratch.mit.edu/studios/4413241/. В ней есть еще несколько интересных рекурсивных алгоритмов.

Рекурсивный алгоритм

Рекурсивный алгоритм

Рекурсивное определение

Предметы для изучения

  • решение задачи с помощью рекурсивного алгоритма
  • вычислительная функция с рекурсивным алгоритмом
  • Проверка принадлежности к набору с помощью рекурсивного алгоритма

Содержимое

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

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

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

Пример 1: Алгоритм нахождения k -го четного натурального числа
Обратите внимание, что это можно очень легко решить, просто выведя 2 *( k — 1 ) для данного к . Однако цель здесь — проиллюстрировать основную идею рекурсии, а не решить проблему.

Алгоритм 1:  Четное ( положительное целое число k )
Вход: k , положительное целое число
Вывод: k -е четное натуральное число (первое четное 0 )

Алгоритм:
если к = 1 , то вернуть 0 ;
иначе возврат Четный( k-1 ) + 2 .

Здесь вычисление Even( k ) сводится к вычислению Четный для меньшего входного значения, т.е. Четный( к-1 ). Четное( k ) в итоге становится Четное( 1 ) это 0 по первой строке. Например, для вычисления Even( 3 ) , Алгоритм Even( k ) вызывается с к = 2 . При вычислении Четный( 2 ) , Алгоритм Even( k ) вызывается с помощью k = 1 . Поскольку Even( 1 ) = 0, 0 возвращается для вычисления Чет( 2 ) и Чет( 2 ) = Чет( 1 ) + 2 = 2 есть полученный. Это значение 2 для Четный( 2 ) теперь возвращается для вычисления Четный( 3 ) и Чет ( 3 ) = Чет ( 2 ) + 2 = 4 получается.
Как видно из сравнения этого алгоритма с рекурсивным определением набор неотрицательных четных чисел первая строка алгоритма соответствует основному пункту определения, а вторая строка соответствует к индуктивному предложению.

Для сравнения посмотрим, как та же задача может быть решена с помощью итеративного алгоритма.

Алгоритм 1-a:  Четное ( положительное целое число k )
Ввод: k , положительное целое число
Вывод: k -е четное натуральное число (первое четное 0 )

Алгоритм:
int i , даже ;
i := 1 ;
даже := 0 ;
в то время как ( я < к ) {
          четный := четный + 2 ;
          i := i + 1 ;
}
вернуть даже .

Пример 2: Алгоритм вычисления k -й степени 2

Алгоритм 2  степень_2( натуральное число к)
Ввод: k , натуральное число
Выход: k -я степень числа 2

Алгоритм:
если к = 0 , то вернуть 1 ;
иначе вернуть 2*степень_2(k — 1 ) .

Для сравнения посмотрим, как та же задача может быть решена с помощью итеративного алгоритма.

Алгоритм 2-a  степень_2( натуральное число k)
Ввод: k , натуральное число
Выход: k -я степень числа 2

Алгоритм:
int i , мощность ;
i := 0 ;
мощность := 1 ;
пока( i < k ) {
          мощность := мощность * 2 ;
          i := i + 1 ;
}
возврат мощность .

Следующий пример не имеет соответствующего рекурсивного определения. Он показывает рекурсивный способ решения проблемы.

Пример 3: Рекурсивный алгоритм последовательного поиска

Алгоритм 3  SeqSearch( L, i, j, x )

Ввод: L — массив, i и j — положительные целые числа, i j и x ключ искать в L .
Вывод: Если x находится в L между индексами и и j , затем выведите его индекс, иначе выведите 0 .

Алгоритм:
если я j , затем
{
    , если L ( i ) = x , , затем возврат и ;
    иначе вернуть SeqSearch( л, я+1, у, х )
}
иначе вернуть 0 .

Рекурсивные алгоритмы также можно использовать для проверки объектов на принадлежность к множеству.

Пример 4: Алгоритм проверки того, является ли число натуральным x

Алгоритм 4  Естественный( число x )
Ввод: Число x
Вывод: » Да » если x является натуральным числом, иначе » Нет »

Алгоритм:
если x < 0 ,   тогда вернуть « Нет »
еще
    если x = 0 ,   , то вернуть « Да »
    иначе возврат Натуральный( x — 1 )

Пример 5: Алгоритм проверки того, является ли выражение w предложением (форма предложения)

Алгоритм 5 Предложение ( строка w )

Вход: Строка А w
Вывод: » Да » если w является предложением, иначе » Нет »

Алгоритм:
если w равно 1 (истина), 0 (ложь), или пропозициональная переменная, , затем , возврат « Да »
иначе если w = ~ w 1 , затем возврат Предложение ( с 1 )
   иначе
     если ( w = w 1 с 2 или с 1 с 2 или же с 1 с 2 или же с 1 с 2 ) и
Предложение ( w 1 ) = Да и  Предложение ( w 2 ) = Да
     затем возврат Да
     иначе вернуть Нет
конец

Проверьте свое понимание рекурсивного алгоритма

Укажите, какие из следующих утверждений верны, а какие нет.
Нажмите «Да» или «Нет» , затем «Отправить».

Далее — Первый принцип математической индукции

Вернуться к расписанию
Вернуться к оглавлению

Введение. Настоящий Python

Если вы знакомы с функциями в Python, то знаете, что одна функция часто вызывает другую. В Python функция также может вызывать сама себя! Функция, которая вызывает сама себя, называется 9.0762 рекурсивная , а метод использования рекурсивной функции называется рекурсией .

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

К концу этого руководства вы поймете:

  • Что означает рекурсивный вызов функции
  • Как дизайн функций Python поддерживает рекурсию
  • Какие факторы следует учитывать при выборе рекурсивного решения проблемы
  • Как реализовать рекурсивную функцию в Python

Затем вы изучите несколько задач программирования на Python, в которых используется рекурсия, и сравните рекурсивное решение с сопоставимым нерекурсивным.

Что такое рекурсия?

Слово рекурсия происходит от латинского слова recurrere , что означает бежать или спешить назад, возвращаться, возвращаться или возвращаться. Вот некоторые онлайн-определения рекурсии:

  • Dictionary.com : Действие или процесс возвращения или побега
  • Викисловарь : Действие по определению объекта (обычно функции) с точки зрения самого объекта
  • Бесплатный словарь : метод определения последовательности объектов, таких как выражение, функция или набор, где задано некоторое количество начальных объектов, и каждый последующий объект определяется в терминах предшествующих объектов

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

Обратите внимание, как определяемое понятие предков проявляется в собственном определении. Это рекурсивное определение.

В программировании рекурсия имеет очень точное значение. Это относится к методу кодирования, при котором функция вызывает сама себя.