64

Программирование Python по моим конспектам. Лекция 29

Пост можно топить, минусить и всячески убивать, ибо в горячем он нахер не нужен, а вот подписчикам пригодится.


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

Отвечая на 90% одинаковых вопросов-

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


Я это делаю, потому что мне это нравится.



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


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

Необходимо с помощью рекурсии посчитать сумму элементов списка.


Итак, сначала решение, а затем объяснения.

Объявляем функцию summ c параметром list.

если последовательность пуста- вернуть ноль

Иначе к первому элементу последовательности прибавить сумму остальных элементов.

В нашем случае это так выглядит

summ([1,2,5,7])=

1+(summ([2,5,7])+(2+summ([5,7]))+(5+summ([7]))


На практике нам часто приходится искать элимент в последовательности. Конечно, мы можем сделать это, используя оператор in

>>>3 in (3,5,)

>>>True


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


К примеру, дан ряд телефонных номеров в списке.

125 254455

012 124598

598 634654

012 874646

546 654545


необходимо найти все номера, которые начинаются с кода 012


Алгоритм таков.

1. Если список состоит из одного элемента, проверь удовлетворяет ли он условия поиска. Если да, верни список, если нет- верни пустой список

2 Если список состоит из нескольких элементов, раздели этот список на две приблизительно равных части, объедини их и проведи алгоритм заново для обеих частей.


Выглядит так.

На этом пока все.

Вы смотрите срез комментариев. Показать все
3
Автор поста оценил этот комментарий

Какие-то странные алгоритмы, ибо очень сильно проигрывают простым (в плане того, что первое приходит на ум) алгоритмам на циклах.


Есть один отличный пример со срезами и рекурсией - это умножение списка чисел.


Суть в том чтобы левый и правый множитель всегда были примерно одинаковыми, потому что умножение большого числа на маленькое происходит очень долго.


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


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


Вот код: https://pastebin.com/re8YV5gZ


Результат работы (перемножение 500к элементов от 1 до 100) у меня:

0:00:00.658491 - рекурсивный алгоритм
0:00:26.584806 - перемножение через цикл с аккумулирующей переменной
0:00:26.970702 - reduce

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

раскрыть ветку (2)
0
DELETED
Автор поста оценил этот комментарий

После увиденного haskell вспомнил.

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

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества