- Как работает рекурсия в python?
- Что такое рекурсия в Python?
- Примеры
- 1. Факториал целого числа
- 2. Ряд Фибоначчи
- Базовый случай
- Преимущества
- Недостатки
- Вычисление суммы элементов списка при помощи рекурсии
- Решение задачи
- Исходный код
- Объяснение работы программы
- Результаты работы программы
- Вычислить сумму элементов списка с использованием рекурсивной функции
Как работает рекурсия в python?
Когда функция вызывает сама себя, она называется рекурсивной функцией. В этом руководстве мы узнаем, как написать функцию рекурсии Python.
Что такое рекурсия в Python?
Когда функция определена таким образом, что она вызывает сама себя, она называется рекурсивной функцией. Это явление называется рекурсией. Python поддерживает рекурсивные функции.
Рекурсия очень похожа на цикл, в котором функция вызывается на каждой итерации. Вот почему мы всегда можем использовать циклы как замену функции рекурсии Python.
Но некоторые программисты предпочитают рекурсию циклам. В основном это вопрос выбора, и вы можете использовать циклы или рекурсию.
Примеры
Следующий код возвращает сумму первых n натуральных чисел, используя рекурсивную функцию python.
def sum_n(n): if n== 0: return 0 else: return n + sum_n(n-1)
Это печатает сумму первых 100 натуральных чисел и первых 500 натуральных чисел
print(sum_n(100)) print(sum_n(500))
C:/Users/TutorialsPoint1/~.py 5050 125250
1. Факториал целого числа
Факториал целого числа вычисляется путем умножения целых чисел от 1 до этого числа. Например, факториал 10 будет 1 * 2 * 3…. * 10.
Давайте посмотрим, как мы можем написать факториальную функцию с помощью цикла for.
def factorial(n): result = 1 for i in range(1, n + 1): result = result * i return result print(f'Factorial of 10 = ') print(f'Factorial of 5 = ')
Давайте посмотрим, как мы можем изменить функцию factorial() для использования рекурсии.
def factorial(n): if n == 1: return 1 else: return n * factorial(n - 1) print(f'Factorial of 10 = ') print(f'Factorial of 5 = ')
На изображении ниже показано выполнение рекурсивной функции.
2. Ряд Фибоначчи
Ряд Фибоначчи — это последовательность чисел, каждое из которых представляет собой сумму двух предыдущих чисел. Например — 1, 1, 2, 3, 5, 8, 13, 21 и так далее.
Давайте посмотрим на функцию для возврата чисел ряда Фибоначчи с помощью циклов.
def fibonacci(n): """ Returns Fibonacci Number at nth position using loop""" if n == 0: return 0 if n == 1: return 1 i1 = 0 i2 = 1 num = 1 for x in range(1, n): num = i1 + i2 i1 = i2 i2 = num return num for i in range(10): print(fibonacci(i), end=" ") # Output: 0 1 1 2 3 5 8 13 21 34
Вот реализация функции fibonacci() с использованием рекурсии.
def fibonacci(n): """ Returns Fibonacci Number at nth position using recursion""" if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n - 1) + fibonacci(n - 2) for i in range(10): print(fibonacci(i), end=" ") # Output: 0 1 1 2 3 5 8 13 21 34
Здесь рекурсивный код функции меньше и прост для понимания. Так что использование рекурсии в этом случае имеет смысл.
Базовый случай
При определении рекурсивной функции должен быть хотя бы один базовый случай, для которого нам известен результат. Затем каждый последующий вызов рекурсивной функции должен приближать ее к базовому случаю.
Это необходимо для того, чтобы в конечном итоге рекурсивные вызовы прекратились. В противном случае функция никогда не завершится и мы получим ошибку нехватки памяти.
Вы можете проверить это поведение в обоих приведенных выше примерах. Аргументы вызова рекурсивной функции становятся все ближе к базовому случаю.
Преимущества
- Иногда рекурсия уменьшает количество строк кода.
- Код выглядит просто.
- Если мы знаем базовый случай, тогда использовать в функции проще.
Недостатки
- Если не реализовано должным образом, функция никогда не завершится.
- Понимание рекурсии вызывает большую путаницу по сравнению с циклами.
Вычисление суммы элементов списка при помощи рекурсии
Программа принимает на вход список и вычисляет сумму его элементов, используя рекурсию.
Решение задачи
- Определяем рекурсивную функцию, которая в качестве аргументов принимает список и его длину.
- Принимаем длину цикла и записываем ее в отдельную переменную.
- Создаем новую переменную и инициируем ее пустым списком.
- Для добавления элементов в список используем цикл.
- Передаем сформированный список и его длину в рекурсивную функцию в качестве аргументов.
- В качестве базы рекурсии принимается условие равенства длины списка 0 . Если длина списка равна 0 , работа функции завершается и она возвращает в качестве результата 0 .
- В противном случае возвращается сумма последнего элемента списка вместе с рекурсивным вызовом функции, где длина массива уменьшена на 1 .
- Значение рекурсивной функции записывается в отдельную переменную, значение которой потом выводится на экран.
- Конец.
Исходный код
Ниже дан исходный код, который вычисляет сумму элементов списка при помощи рекурсии. Результаты работы программы также даны ниже.
def sum_arr(arr, size): if (size == 0): return 0 else: return arr[size - 1] + sum_arr(arr, size - 1) n = int(input("Введите длину списка:")) a = [] for i in range(0, n): element = int(input("Введите элемент списка:")) a.append(element) print("Весь список:") print(a) print("Сумма элементов списка равна:") b = sum_arr(a, n) print(b)
Объяснение работы программы
- Пользователь вводит число элементов списка, которое сохраняется в отдельной переменной n .
- Далее пользователь n раз вводит элементы массива, длину которого мы будем вычислять.
- Введенные данные добавляются в заранее созданный список a при помощи функции append() . Для наглядности окончательный список выводится на экран.
- Затем введенный список и его длина передаются в качестве аргументов в рекурсивную функцию sum_arr() , код которой мы написали ранее.
- Как только длина списка уменьшается до 0 , работа функции прекращается и она перестает вызывать сама себя.
- Пока длина списка не равна нулю, функция возвращает сумму последнего элемента списка и вызов самой себя с длиной списка, уменьшенной на 1 .
- Результат работы функции записывается в переменную b , которая затем выводится на экран.
Результаты работы программы
Пример 1: Введите длину списка:3 Введите элемент списка:3 Введите элемент списка:56 Введите элемент списка:7 Весь список: [3, 56, 7] Сумма элементов списка равна: 66 Пример 2: Введите длину списка:5 Введите элемент списка:23 Введите элемент списка:45 Введите элемент списка:62 Введите элемент списка:10 Введите элемент списка:56 Весь список: [23, 45, 62, 10, 56] Сумма элементов списка равна: 196
Вычислить сумму элементов списка с использованием рекурсивной функции
Вычислить количество элементов списка с использованием рекурсивной функции
Пожалуйста, помогите решить задачку, не могу придумать, как тут может быть использована рекурсия))
С использованием рекурсивной функции вычислить сумму
Помогите плиз)) Нужно составить программу с использованием рекурсивной функции вычислить сумму.
Вычислить с использованием рекурсивной функции произведение элементов
Привествую, друзья. Помогите пожалуйста дойти до решения этой программы. Успешно сделать это не.
С помощью рекурсивной функции вычислить сумму элементов одномерного массива
С помощью рекурсивной функции вычислить сумму элементов одномерного массива. Есть примеры но.
С помощью рекурсивной функции вычислить сумму элементов одномерного массива
С помощью рекурсивной функции вычислить сумму элементов одномерного массива,помогите.
1 2 3 4 5 6 7 8 9 10 11 12
Massiv = [1, 2, 3, 4, 5] Summa = 0 def DSumma(x): global Summa if x == len(Massiv): return Summa += Massiv[x] DSumma(x+1) DSumma(0) print('\nSumma = ', Summa)
def summa(arr): if arr==[]: return 0 else: return arr.pop(len(arr)-1) + summa(arr)
baigarinovaliba, а не лучше ли отщипывать по элементу с начала списка?
Добавлено через 2 минуты
def sumList(x): if x==[]: return 0 else: return x[0]+sumList(x[1:]) print(sumList([1,2,3,4]))
Catstail, создавать при каждом вызове функции копию массива, уменьшенную на один элемент (срезы в python делают именно это) — на мой взгляд, не самое удачное решение.
baigarinovaliba, тоже не слишком удачное решение, так как функция изменяет исходный массив.
Я бы решил эту задачу так:
def sumList(x, i = 0): if i >= len(x): return 0 return x[i] + sumList(x,i + 1)
Starfer, а еще рациональнее, вероятно, вот так:
def sumList(x): def sumL(x,s,i): if i0: return s else: return sumL(x,s+x[i],i-1) return sumL(x,0,len(x)-1)
Здесь длина списка вычисляется всего один раз. И, к тому же, рекурсия хвостовая (уж не знаю, играет ли это роль в Питоне).