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 Если список состоит из нескольких элементов, раздели этот список на две приблизительно равных части, объедини их и проведи алгоритм заново для обеих частей.


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

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

Тот самый Скуф
Автор поста оценил этот комментарий

Вообще, на мой взгляд Питон не лучший язык для обучения программированию. Он слишком перегружен синтаксическим "сахаром" и всякими фичами. Лучше старого доброго Паскаля вряд-ли что-то можно найти.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
меня в универе учили по такой схеме

1. С

2. С++

3. Java

4. Php

5. Python


От тяжелого к легкому. Поэтому..ну мне кажется самым легким для понимания именно питон

показать ответы
0
Тот самый Скуф
Автор поста оценил этот комментарий
ну мне кажется самым легким для понимания именно питон

Потому что ты уже знаешь C, C++, Яву и PHP. Для новичка это всё тяжело понимается - списки, туплы-кортежи, ассоциативные массивы, итераторы, генераторы и прочая и прочая. Вообще, обучение программированию это обучение составлению алгоритмов, а не зубрёжка ключевых слов очередного языка.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
Дело в том, что когда я учился, программа была составлена специально от сложного к простому, дабы отсеять людей.

Поэтому не я придумал, что питон проще. Там люди умные мозги парили по этому поводу.

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

Да и вообще- я не хочу сказать, что он супер язык для новичков (Я своей любви к С не изменю). Но он вполне себе подойдет для этой цели.

5
Тот самый Скуф
Автор поста оценил этот комментарий

В питончике есть встроенная функция sum()

раскрыть ветку (1)
1
Автор поста оценил этот комментарий
тссс..никому не говори) Это тайна
показать ответы
0
Автор поста оценил этот комментарий
значит вы вундеркинд и я хочу от вас детей.Бггг
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Неужели мне удалось смешно пошутить?
показать ответы
3
Автор поста оценил этот комментарий

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


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


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


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


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


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


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

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

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

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

Не надо так: "list". Хоть функция суммы не названа, как стандартная функция "sum".
Надеюсь в лекциях это всё чисто для примера рекурсий, а не для использования в реальном коде, так как есть однострочные замены.

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

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества

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

Теги

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

Сообщества