Помните
Рекурсивные функции, общая тема, когда вы изучаете свою карьеру, например, инженер -инженер O, но это еще более распространено, узнайте только фундаментальный:
Рекурсивная функция – это когда функция вызывает себя для того, чтобы уменьшить большую проблему к другой, каждая более маленькая до достижения базового корпуса.
Классическим примером подсчитайте фактор положительного числа:
def factorial(n): if n == 0: return 1 return n * factorial(n - 1) print(factorial(4))
Плохо
Компилятор должен сложить каждую рекурсивную функцию, вызванную в стеке вызовов, пока не найдет базовый корпус. Затем вернитесь, чтобы разрешить каждый В ожидании операции Это осталось в стеке вызовов:
# call stack simulation: factorial(4) 4 * factorial(3) 3 * factorial(2) 2 * factorial(1) 1 * factorial(0) return 1 1 * 1 -> return 1 2 * 1 -> return 2 3 * 2 -> return 6 4 * 6 -> return 24 >>> 24
Приведенная выше реализация может быть легко переполнить стек вызовов большими числами.
Хвостовая рекурсия
Это та часть, которая пропустила во многих случаях, когда говорят о рекурсии. Существуют способ оптимизации рекурсивных функций, а наконечник: Не оставлять ожидающие операции При вызове функции рекурсивного режима.
Теперь давайте оптимизируем приведенный выше пример:
def factorial(n, acum=1): if n == 0: return acum return factorial(n - 1, acum * n) print(factorial(4)) # >>> 24
Что изменилось?
Новый acum
Переменная помощь в качестве аккумулятора для расчета факториала. Далее сравните оператор возврата функций:
- Не оптимизированный пример:
Вернуть n * Фактор (n - 1)
- Оптимизированный пример:
вернуть фактор (n - 1, acum * n)
Вам нужно найти способ не оставить ожидающие операции, если вы хотите рекурсию хвоста.
С оптимизированной рекурсивной функцией компилятору не нужно складывать каждую вызванную рекурсивную функцию, только изменяйте значение функции параметров входа и выполнять до тех пор, пока базовый случай не станет истинной:
# call stack simulation: factorial(4, 1) factorial(3, 4) factorial(2, 12) factorial(1, 24) factorial(0, 24) return 24 >>> 24
Больше нет страха, что стек вызовов переполнен.
Поддержка хвостовой рекурсии
К сожалению, не все языки программирования поддерживают хвостовую рекурсию в вашем компиляторе/интерпретаторе. Python – один из них , но есть несколько Библиотеки Это помогает имитировать это поведение с декораторами.
Эта статья В Википедии перечислены некоторые языки программирования, которые поддерживают рекурсию хвоста.
В любом случае, интересно видеть, как мы можем улучшить алгоритмическую сложность программы, и я надеюсь, что вам это тоже понравилось.
Спасибо!
Следуй за мной на Twitter Анкет
Оригинал: “https://dev.to/victorhtorres/how-do-you-optimizing-recursive-functions-326f”