×
  • 1. Установка Python 3.7
  • 2. Варианты выполнения кода. Первая программа
  • 3. Объекты. Числа и операции над ними
  • 4. Переменные в Python. Оператор присваивания
  • 5. Функция input()
  • 6. Функция print()
  • 7. Деление нацело и деление по остатку
  • 8. Функции trunc, floor, ceil
  • 9. Деление нацело и по остатку отрицательных чисел в Python
  • 10. Логический тип Bool. Операции сравнения
  • 11. Cтроки и операции над ними
  • 12. Строки: индексы и срезы
  • 13. Строки и их методы
  • 14. Списки и операции над ними
  • 15. Списки: индексы и срезы
  • 16. Списки и их методы
  • 17. Условный оператор if
  • 18. Вложенный оператор if
  • 19. Множественный выбор elif
  • 20. Цикл while
  • 21. Обход всех цифр числа с помощью while
  • 22. Алгоритм Евклида
  • 23. Цикл while. Нахождение всех делителей числа
  • 24. Цикл while. Инструкции break, continue, else
  • 25. Функция range и итерируемые объекты
  • 26. Цикл for. Обход элементов функции range
  • 27. Цикл for. Обход списков и строк
  • 28. Установка, настройка и использование PyCharm
  • 29. Метод подсчета. Сортировка подсчетом Python
  • 30. Вложенные циклы
  • 31. Вложенные списки
  • 32. Треугольник Паскаля
  • 33. Множества в Python. Тип данных set
  • 34. Словари Python. Операции и методы словаря
  • 35. 4 Ситуации, где полезно использовать словарь
  • 36. Как отсортировать словарь в Python
  • 37. Кортежи (tuple). Операции и методы кортежей
  • 38. Функции (def). Определение и вызов функции
  • 39. Зачем нужны функции в программировании
  • 40. Возвращаемое значение функции. Оператор return
  • 41. Область видимости: локальная, глобальная и встроенная.
  • 42. Вложенные функции Python
  • 43. Замыкания в Python. Closure Python
  • 44. Замыкания в Python Часть 2
  • 45. Передача аргументов. Сопоставление аргументов по имени и позиции
  • 46. *args и **kwargs Python. Передача аргументов в функцию
  • 47. Рекурсия в Python. Рекурсивная функция Часть 1
  • 48. Рекурсия в Python. Рекурсивная функция Часть 2
  • 49. Рекурсивный обход файлов
  • 50. Функция enumerate
  • 51. Анонимная функция Lambda
  • 52. Генераторы списков Python | List comprehension
  • 53. Генераторы списков 2 | List comprehension | Вложенные генераторы списков
  • 54. Выражения-генераторы
  • 55. Функция генератор. Создание генератора при помощи yield
  • 56. Функция map Python.
  • 57. Функция filter
  • 58. Функция zip python
  • 59. Сортировка коллекций в Python. Метод sort и функция sorted
  • 60. Декораторы в Python Часть 1
  • 61. Декораторы в Python Часть 2
  • 62. Сортировка по ключу Python. Аргумент key
  • 63. Установка модулей в Python || Установка пакета Python
  • 64. Работа с файлами в Python. Чтение и запись данных
  • 65. Экранированные и служебные символы в Python
  • 66. Встроенная функция isinstance
  • 67. Функции all и any.
  • 68. Форматирование строк. Метод format
  • 69. F-строка
  • 70. Импорт стандартных модулей
  • 71. Импорт собственных модулей в Python
  • 72. 7 видов вызываемых (callable) объектов в Python
  • 73. Метод split и метод join Python
  • 74. Пакеты в Python. Файл __init__, переменная __all__
  • 75. Работаем с JSON в Python. Парсинг JSON, сохраняем JSON в файл
  • Рекурсия в Python

    Взгляните на картинки ниже и вы поймете, что уже встречались с рекурсией в реальной жизни.


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

    Но если вы напишите функцию,которая будет вызывать саму себя бесконечное количество раз, получите ошибку Recursionerror: maximum recursion depth exceeded. Попробуйте запустить у себя на компьютере следующую программу.

    def rec(x):
        print(x)
        rec(x+1)
    
    rec(1)

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

    def rec(x):
        if x<4:
            print(x)
            rec(x+1)
            print(x)
    
    rec(1)

    Условие выхода называют также базовым случаем - самым простым решением какой-нибудь задачи.

    Нахождение факториала с помощью рекурсии

    Например, базовым случаем (самым простым случаем) нахождения факториала, является 1! или 0!. Это значение гораздо легче найти, чем например 7! (факториал 7).

    Но рекурсии кроме базового случая должен присутствовать рекурсивный случай или шаг рекурсии - это способ сведения задачи к более простой. Например, 5! = 1*2*3*4*5 = 4!*5. То есть, чтобы найти факториал пяти, достаточно знать факториал четырех и умножить это на 5. Тогда в общем виде рекурентная формула нахождения факториала будет выглядеть следующим образом:


    А код реализации будет следующим:

    def fact(x):
        if x == 1 or x == 0:
            return 1
        return fact(x - 1) * x
    
    a = int(input())
    print(fact(a))
    Нахождение чисел Фибоначчи

    Числа Фибоначчи представляют собой рекурентный ряд чисел - это значит, что в этом ряду должны быть обязательно первые члены ряда (обычно это 0 и 1), а все остальные числа находятся от предыдущих путем сложения двух чисел стоящих перед текущим.

    В итоге получаем такой ряд: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 и т.д.

    У каждого числа в этом ряду есть свой порядковый номер, начинается нумерация с единицы. И давайте обозначим за F(n) - n-ое число Фибоначчи. И тогда,чтобы найти пятое число Фибоначчи нужно сложить два предыдущих к нему F(5) = F(4)+F(4). А общая формула нахождения будет выглядеть следующим образом:


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

    Проверить строку на палиндром(рекурсия)

    Палиндром - слово или фраза, которые одинаково читаются слева направо и справа налево.

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

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

    Ниже представлена рекурсивная функция, которая реализует проверку на палиндром.

    def palindrom(s):
        if len(s) <= 1:
            return True
        if s[0] != s[-1]:
            return False
        return palindrom(s[1:-1])
    
    a = input()
    print(palindrom(a))

    Задать вопрос