Рубрики
Без рубрики

Как вы оптимизируете рекурсивные функции

Давайте запомним рекурсивные функции, общую тему, когда вы изучаете свою карьеру, как … Tagged с рекурсивными функциями, Python, Bigo.

Помните

Рекурсивные функции, общая тема, когда вы изучаете свою карьеру, например, инженер -инженер 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”