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

Python Factorial примеры

В этой статье мы посмотрим, как мы можем рассчитать факториал Python, используя разные подходы.

Автор оригинала: Pankaj Kumar.

Python Factorial примеры

В этой статье мы посмотрим, как мы можем рассчитать факториал Python, используя разные подходы.

Факториальная функция Python

Факториальная функция Python факториал (n) определяется для целого числа N Отказ Это вычисляет продукт всех условий от N к 1 Отказ факториал (0) принимается, чтобы быть 1 Отказ

Итак, функция:

factorial(n) = n * (n-1) * (n-2) * ... * 1, n >= 1
factorial(n) = 1, n = 0

Поэтому факториал (4) * 3 * 2 * Отказ

Давайте проанализируем, как мы можем написать эту математическую функцию в Python.

Используя Math. Iffactorial ()

Мы можем напрямую использовать Математика Факториальная функция модуля для выполнения работы для использования:

import math

def factorial(x):
    return math.factorial(x)

print(factorial(5))

Выход

120

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

Использование итерационной процедуры

Мы можем напрямую закрутить все числа для 1 до n и напрямую умножать продукт.

def factorial(n):
    if n == 0:
        return 1
    prod = 1
    for i in range(1, n+1):
        prod = prod * i
    return prod

if __name__ == '__main__':
    print(factorial(4))
    print(factorial(7))

Выход

24
5040

Давайте теперь посмотрим на использование рекурсивного метода для факториальной функции Python.

Использование рекурсивной процедуры

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

Поскольку структура задачи является убывающим продуктом, мы можем моделировать рекурсию следующим образом:

factorial(n) = n * factorial(n-1), n >= 1
factorial(0) = 1, n = 0

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

Мы напишем соответствующую функцию Python для этого:

def factorial(n):
    if n == 0:
        # Base case n = 0
        return 1
    else:
        # Use the definition of factorial function
        return n * factorial(n-1)

if __name__ == '__main__':
    print(factorial(4))
    print(factorial(7))

Выход

24
5040

Это, кажется, правильно. Давайте проанализируем, что на самом деле происходит в рекурсионных звонках.

Всякий раз, когда используются рекурсионные звонки, есть Стек вызовов , который непрерывно хранит состояние программы, пока не будет достигнут базовый случай. Элементы стека, наконец, выскочили один за другим после того, как значение возвращается соответствующим блоком, когда рекурсион раскручивается от N Отказ

Весь процесс объяснен на рисунке ниже, для поиска факт (3) Отказ Первая часть всего процесса – накопление стека, где каждая из этих рекурсивных вызовов сложена друг на друга, пока функция не возвращается 1.

Как только функция больше не может рекурсивно звонить, она начинает расчет факториала, как показано ниже.

Рекурсионный стек

Когда функции возвращаются, элементы стека выскочили один за другим, сверху. Когда он наконец достигнет Главная () Стек, функция наконец завершена, и у нас есть наша ценность, которая выходит 6 Отказ

Хвостовые рекурсивные звонки

Пока наша программа отлично работает, проблема с нашей рекурсивной функцией состоит в том, что размер стека растет так же, как размер ввода.

Так что если N Это очень большое количество, наша стек рекурсии может быть очень большим, что может привести к переполнению стека! Чтобы избежать этого, мы будем использовать другой подход к кодированию рекурсивной функции, называемый A Хвост-рекурсивная процедура Отказ

Вызов процедуры хвоста направлен на выполнение вызова рекурсии после вычисления промежуточного результата. Итак, вместо увеличения размера стека, программа может использовать один и тот же стек для всего процесса! Это нужно только быть обновленным.

Это означает, что наш рекурсивный звонок должен всегда быть в конце. Вот почему это «задний звонок».

def fact_helper(accum, n):
    if n == 0:
        return accum
    return fact_helper(accum*n, n-1)

def factorial(n):
    return fact_helper(1, n)

if __name__ == '__main__':
    print(factorial(4))
    print(factorial(7))

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

Хитрость состоит в том, чтобы пройти аккумулятор в качестве параметра к рекурсивной функции и обновлять его, используя accom * n Отказ Таким образом, мы будем хранить промежуточное состояние в одной переменной и, следовательно, только в одном кадре стека!

Выход

24
5040

Вы получаете тот же выход, что и раньше! Теперь вы также гарантировали, что программа использует только один кадр стека, поэтому он по существу эквивалентен итеративной процедуре! Разве это не приятно?

Заключение

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

использованная литература