Рекурсия в программировании Что такое рекурсия Описание, изображение какого-либо объекта или процесса внутри самого этого объекта или процесса. Объект, содержащий сам себя. С рекурсией можно столкнуться в обычной жизни: Если вы ждете гостей и вдруг заметили на своем костюме пятно, не огорчайтесь. Это поправимо. Например, пятна от растительного масла легко выводятся бензином. Пятна от бензина легко снимаются раствором щелочи. Пятна от щелочи исчезают от уксусной эссенции. Следы от уксусной эссенции надо потереть подсолнечным маслом. Ну, а как выводить пятна от подсолнечного масла, вы уже знаете... В повседневной и научной жизни нас окружает рекурсия: Например: Треугольник Серпинского Эффект Дросте Вычисление факториала Числа Фибоначчи Рекурсия в программировании В вопросе составления алгоритма и/или кода программы рекурсией будет называться такая ситуация, когда подпрограмма (функция) вызывает сама себя в своем теле или через внешнюю функцию, при этом работа функции производится с разными входными данными (аргументами). Алгоритм с рекурсией будет называться рекурсивным. Рекурсия в алгоритме бывает: Простая (прямая) Сложная (непрямая) Простая рекурсия Сложная рекурсия Практически любой алгоритм можно написать, используя рекурсию, и наоборот Существует два подхода к решению задачи итеративный и рекурсивный. В одном случае мы будем использовать цикл или серию циклов с условиями для повторения действия с целью получить результат. В другом - рекурсию. Например, необходимо найти ключ, который лежит в одной из множества коробок. Что нам нужно делать? Перебирать коробки до тех пор, пока мы не найдем ключ. Выбор описания сценария поиска зависит только от Вас. При использовании рекурсии важно помнить: 1. В рекурсивной функции всегда есть два случая: рекурсивный и граничный случаи. Рекурсивный случай – когда функция вызывает саму себя, а граничный – когда функция перестает себя вызывать. Расчет числа Фибоначчи: Fib – имя функции N – входное число Наличие граничного случая обязательно и предотвращает зацикливание. Fib (N) IF N = 0 THEN PRINT 0 IF N = 1 THEN PRINT 1 ELSE F = Fib(N-1) + Fib(N-2) PRINT F ENDIF Рекурсию необходимо помещать в рамки условия и/или цикла IF, FOR, WHILE и др. END При использовании рекурсии важно помнить: 2. Использование рекурсивного алгоритма подразумевает использование практически не контролируемого ресурса: стека вызовов. Локальные переменные сохраняются на стеке пока выполняется функция. Это можно изобразить в виде стопки книг, которая растет вверх пока выполняется функция. Когда наступает определенное условие, Вы начнете снимать книги, начиная с самой верхней. Расчета факториала: Имя функции fact(x): Если y>0 То x = fact(y-1)*y Иначе x = 1 Конец условия Один из примеров рекурсии в действии – алгоритм сортировки quicksort (быстрая сортировка) Как вызвать функцию: BEGINE int A[M] A={ } N = length (A) First_ind = 1 Last_ind = N Quicksort(A,first_ind,last_ind) WRITE A END Что функция под собой скрывает: Quicksort(A, first, last): IF first<last OR Length(A)>1 THEN mid = A[first] l = first+1 r = last WHILE (r > l): WHILE (l < mid): l = l+1 WHILE (r > mid): r = r-1 IF (l<=r) THEN swap A[l] -- A[r] ENDWHILE IF first<r THEN Quicksort(A, first, r) ENDIF IF last > l THEN Quicksort(A, l, last) ENDIF ENDIF Примеры использования рекурсии в рамках биоинформатики 1. Построение филогенетических деревьев (на примере алгоритма обхода в прямом порядке: от корня к ветвям (поддеревьям)) Примеры использования рекурсии в рамках биоинформатики 2. Перевод последовательности нуклеотидов в числовую последовательность (такой подход уменьшает саму длину строки и упрощает работу) Примеры с использованием рекурсии Нахождение суммы цифр числа Функция COUNT X – входное число COUNT(X) V = X / 10 IF V = 0 THEN PRINT X ELSE Y = X % 10 + COUNT(V) PRINT Y ENDIF END Вычисление степени числа Функция STEP A и b – входные числа STEP(A,B) IF B = 0 THEN PRINT 1 ELSE C = A * STEP(A, B-1) PRINT C ENDIF END