Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это подборки моих материалов на канале
Рекурсивный перебор коллекций в Python
До сих мы рассматривали так называемую прямую рекурсию. При прямой рекурсии функция вызывает самую себя. А сегодня интересный пример, так называемой косвенной рекурсии. Суть её можно упрощённо представить так: функция вызывает другую функцию, которая может потом вызвать первую функцию. Иногда таких "других" функций может быть несколько.
Задача, которую мы сейчас рассмотрим, известная. Дело в том, что элементами коллекций (списков, кортежей, множеств, словарей) могут быть другие коллекции, элементами которых также могут быть сложные элементы. Задача стоит так: нужно вывести простые элементы данной структуры. Рекурсия явно напрашивается для реализации данной задачи.
Ниже представлена программа, которая имеет на входе сложную иерархическую структуру из коллекций. Нужно развернуть структуру в линейную последовательность, обозначая вложенность.
На входе программы подается коллекция, на выходе развёрнутая структура с выводом простых элементов. Для того, чтобы можно было подавать на вход структуру коллекция в том виде, в каком она используется в программе, мы используем функцию eval(), которая преобразует строку в нужную программную структуру.
Обратим внимание, что функция gettype() вызывает функции coll() или dic(), которые в свою очередь вызывают gettype(). Т.е. на лицо косвенная рекурсия.
Например, на входе
{(1, 2, 3), (3, 4, 5), (4, 6, (1000, 1001))}
На выходе
Множество 0
Кортеж 1
3
4
5
Конец кортежа 1
Кортеж 1
4
6
Кортеж 2
1000
1001
Конец кортежа 2
Конец кортежа 1
Кортеж 1
1
2
3
Конец кортежа 1
Конец множества 0
Числами показывается уровень вложенности.
Ещё один пример
[[[1, [10001, 10002, 'qwerty', (90, 91)]]], [[2]], [[3]], [[4]]]
На выходе
Список 0
Список 1
Список 2
1
Список 3
10001
10002
qwerty
Кортеж 4
90
91
Конец кортежа 4
Конец списка 3
Конец списка 2
Конец списка 1
Список 1
Список 2
2
Конец списка 2
Конец списка 1
Список 1
Список 2
3
Конец списка 2
Конец списка 1
Список 1
Список 2
4
Конец списка 2
Конец списка 1
Конец списка 0
Ну пока, всё!
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.