Как найти факториал с помощью питона

На чтение 3 мин Просмотров 4.2к. Опубликовано 28.02.2023

Содержание

  1. Введение
  2. Вычисление факториала циклом while
  3. Цикл while
  4. Цикл for
  5. Вычисление факториала Рекурсией
  6. Вычисление факториала методом factorial()
  7. Заключение

Введение

В ходе статьи рассмотрим 3 способа вычислить факториал в Python.

Вычисление факториала циклом while

Цикл while

Для начала дадим пользователю возможность ввода числа и создадим переменную factorial равную единице:

number = int(input('Введите число: '))
factorial = 1

Как мы знаем, факториал – это произведение натуральных чисел от единицы до числа n. Следовательно создадим цикл, который не закончится, пока введённое пользователем число больше единицы. Внутри цикла увеличиваем значение в переменной factorial умножая его на переменную number, после чего уменьшаем значение в number на единицу:

number = int(input('Введите число: '))
factorial = 1

while number > 1:
    factorial = factorial * number
    number = number - 1

print(factorial)

# Введите число: 10
# 3628800

Цикл for

Обычно способ нахождения факториала при помощи цикла for не рассматривается, но почему бы и нет. Принцип не сильно отличается от цикла while, просто приравниваем значение введённое пользователем к переменной factorial, а в цикле указываем количество итреаций начиная с единицы, и заканчивая введённым числом:

number = int(input('Введите число: '))
factorial = number

for i in range(1, number):
    factorial = factorial * i

print(factorial)

# Введите число: 5
# 120

Вычисление факториала Рекурсией

Для вычисления факториала про помощи рекурсии, создадим функцию factorial(), и в качестве аргумента передадим number:

Внутри функции добавим условие, что если переданное число в аргумент number равняется единице, то возвращаем его. Если же условие не сработало, то вернётся аргумент number умноженный на вызов функции factorial() с передачей аргумента number – 1:

def factorial(number):
    if number == 1:
        return number
    else:
        return number * factorial(number - 1)

Дадим пользователю возможность ввода, вызовем функцию и выведем результат в консоль:

def factorial(number):
    if number == 1:
        return number
    else:
        return number * factorial(number - 1)


print(factorial(int(input('Введите число: '))))

# Введите число: 7
# 5040

Вычисление факториала методом factorial()

В стандартном модуле math есть специальный метод для вычисления факториала под названием factorial(). Используем его для нахождения факториала:

from math import factorial

number = int(input('Введите число: '))

print(factorial(number))

# Введите число: 4
# 24

Заключение

В ходе статьи мы с Вами рассмотрели целых 3 способа вычислить факториал в Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂

Admin

Improve Article

Save Article

Like Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Like Article

    Not many people know, but python offers a direct function that can compute the factorial of a number without writing the whole code for computing factorial.

    Naive method to compute factorial

    Python3

    n = 23

    fact = 1

    for i in range(1, n+1):

        fact = fact * i

    print("The factorial of 23 is : ", end="")

    print(fact)

    Output

    The factorial of 23 is : 25852016738884976640000
    

    Time Complexity: O(n)
    Auxiliary Space: O(1)

    Using math.factorial()

    This method is defined in “math” module of python. Because it has C type internal implementation, it is fast.

    math.factorial(x)
    Parameters :
    x : The number whose factorial has to be computed.
    Return value :
    Returns the factorial of desired number.
    Exceptions : 
    Raises Value error if number is negative or non-integral.

    Python3

    import math

    print("The factorial of 23 is : ", end="")

    print(math.factorial(23))

    Output

    The factorial of 23 is : 25852016738884976640000
    

    Time Complexity: O(n)
    Auxiliary Space: O(1)

    Exceptions in math.factorial()

    • If given number is Negative : 

    Python3

    import math

    print("The factorial of -5 is : ", end="")

    print(math.factorial(-5))

    Output:

    Traceback (most recent call last):
      File "/home/f29a45b132fac802d76b5817dfaeb137.py", line 9, in 
        print (math.factorial(-5))
    ValueError: factorial() not defined for negative values
    • If given number is Non – Integral Value : 

    Python3

    import math

    print("The factorial of 5.6 is : ", end="")

    print(math.factorial(5.6))

    Output:

    Traceback (most recent call last):
      File "/home/3987966b8ca9cbde2904ad47dfdec124.py", line 9, in 
        print (math.factorial(5.6))
    ValueError: factorial() only accepts integral values

    This article is contributed by Manjeet Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

    Last Updated :
    08 Dec, 2022

    Like Article

    Save Article

    Вычисление факториала

    Вводится натуральное число. Вычислить его факториал.
    Решение задачи на языке программирования Python

    Факториалом числа называют произведение всех натуральных чисел до него включительно. Например, факториал числа 5 равен произведению 1 * 2 * 3 * 4 * 5 = 120.

    Формула нахождения факториала:

    n! = 1 * 2 * … * n,

    где n – это число, а n! – факториал этого числа.

    Формулу можно представить в таком виде:

    n! = 1 * … * (n-2) * (n-1) * n,

    т. е. каждый предыдущий множитель меньше на единицу, чем последующий. Или в перевернутом виде, когда каждый следующий меньше предыдущего на единицу:

    n! = n * (n-1) * (n-2) * … * 1,

    Для вычисления факториала с помощью цикла можно использовать любую формулу. Для рекурсивного вычисления используется вторая.

    Вычисление факториала с помощью циклов

    С помощь цикла while:

    n = int(input())
     
    factorial = 1
    while n > 1:
        factorial *= n
        n -= 1
     
    print(factorial)

    Вычисление факториала с помощью цикла for:

    n = int(input())
     
    factorial = 1
     
    for i in range(2, n+1):
        factorial *= i
     
    print(factorial)

    Нахождение факториала рекурсией

    def fac(n):
        if n == 1:
            return 1
        return fac(n - 1) * n
     
     
    print(fac(5))

    Поток выполнения программы при n = 5:

    1. Вызов функции fac(5)
    2.   fac(5) вызывает fac(4)
    3.     fac(4) вызывает fac(3)
    4.       fac(3) вызывает fac(2)
    5.         fac(2) вызывает fac(1)
    6.           fac(1) возвращает в fac(2) число 1
    7.         fac(2) возвращает в fac(3) число 1 * 2, т. е. 2
    8.       fac(3) возвращает в fac(4) число 2 * 3, т. е. 6
    9.     fac(4) возвращает в fac(5) число 6 * 4, т. е. 24
    10.   fac(5) возвращает число 24 * 5, т. е. 120 в основную ветку программы
    11. Число 120 выводится на экран

    Функция factorial модуля math

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

    >>> import math
    >>> math.factorial(4)
    24

    Больше задач в PDF

    факториал в Python

    Как вычислить факториал в Python?

    Считать факториал в Python легко, если вам помогает питоновская программа, щелкающая математические операции, как орешки. Однако, прежде, чем Python порадует нас правильными рассчетами, придется нам порадовать Питона новой порцией отменного кода под названием «Факториал!». Но, сначала краткий математический ликбез:

    Что такое факториал числа?

    Факториалом числа N называется произведение всех чисел от единицы до N. О том, что речь идет о факториале, «говорит» восклицательный знак после числа N.

    Например, факториал 5 считается так:
    5! = 1*2*3*4*5

    А факториал 12 равен: 12! = 1*2*3*4*5*6*7*8*9*10*11*12.

    Кстати, факториал нуля равен единице, как и факториал самой единицы:
    0! = 1     1! = 1
    Это нужно запомнить, и обязательно закодить в своей программе!

    Пишем код на Python для вычисления факториала

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

    Рассмотрим несколько вариантов написания кода:

    1. Cамый простой вариант. Это будет цикл for, принимающий на вход число n и выводящий в ответ посчитанный факториал. Если число n является нецелым или отрицательным, выведем сообщение об ощибке. В качестве тренировки, после него рекомендую усложнить задачу и заключить цикл в функцию, как во втором варианте.

    2. Вариант — это функция для вычисления факториала, которой в качестве аргумента будем передавать число n. Этот вариант является «причесанным» первым вариантом.

    3. Вариант — это облагороженный 2-й вариант. Помимо того, что вычисление факториала будет производиться при вызове функции, так еще и программа любезно «попросит» пользователя ввести число, факториал которого нужно рассчитать.

    Итак, приступим к реализации задуманных вариантов!

    ВАРИАНТ №1: Пишем цикл for для вычисления факториала в Python!

    Предлагаю сначала взглянуть на рабочий код. Позже мы рассмотрим каждый шаг подробно:

    # число, факториал которого нужно вычислить
    num = 5
    # начальное значение факториала
    factorial = 1
    
    # Если num является натуральным, то
    if(num%1==0 and num>=0):
        # Вычисляем факториал числа num
        for i in range(1, num+1):
            factorial = i*factorial
        # Выводим результат на экран
        print(f'{num}! = {factorial}')
    # Если num - отрицательное или нецелое число, выводим сообщение об ошибке
    else:
        print('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    

    При значении num=5, результат работы кода выглядит следующим образом:

      <strong>5! = 120</strong>

    А при нецелом значении 3.2:

      <strong>Невозможно вычислить факториал нецелого и/или  отрицательного числа!</strong>

    Разберем код варианта №1 подробно:

    1. Объявляем переменную num и передаем ей число, факториал которого требуется найти:

    # число, факториал которого нужно вычислить
    num = 5
    

    2. Определяем переменную factorial, в которой будет храниться значение вычисленного факториала. В качестве начального значения устанавливаем «1»

    # число, факториал которого нужно вычислить
    num = 5
    # начальное значение факториала
    factorial = 1
    

    3. Проверяем, верно ли задано значение переменной num. Если пользователь ввел нецелое число, тогда остаток от деления этого нецелого числа на единицу будет больше нуля.

    Операция «%» в Python позволяет получить остаток от деления первого числа на второе. Например, 5%1 =0, а 5.5%1 = 0.5

    Таким образом, чтобы проверить, является ли num, целым, нужно сравнить результат операции num%1 с нулем. Кроме этого, нужно убедиться, что число num не является отрицательным, для этого проверим выполнение неравенства num >= 0:

    Добавим проверку перечисленных выше условий:

    # число, факториал которого нужно вычислить
    num = 5
    # начальное значение факториала
    factorial = 1
    
    if (num%1==0 and num>=0):
        # здесь будем считать факториал
    
    #Если же num не удовлетворяет перечисленным условиям, выведем сообщение об ошибке: 
    else:
        print('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    

    4. Вычислим значение факториала числа num. Для целого числа i, принимающего целые значения от 1(включительно) до n+1(не включительно), будем вычислять текущее значение факториала на i и присваивать факториалу новое полученное значение. То есть, при расчете 4! будут происходить действия:

    при i=1 factorial = 1*1=1
    при i=2 factorial = 2*1 = 2
    при i =3 factorial = 3*2 = 6
    при i =4 factorial = 4*6 = 24
    # число, факториал которого нужно вычислить
    num = 5
    # начальное значение факториала
    factorial = 1
    
    if (num%1==0 and num>=0):
        for i in range(1, num+1):
            factorial = i*factorial
    
    #Если же num не удовлетворяет перечисленным условиям, выведем сообщение об ошибке: 
    else:
        print('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    
    

    5. Вывод результата на экран осуществим в виде строки:

    print(f'{num}! = {factorial}')

    Такая конструкция (с буквой f перед кавычками) позволяет вывести значение переменной, заключенной в фигурные скобки. В итоге, код приобретет вид:

    # число, факториал которого нужно вычислить
    num = 5
    # начальное значение факториала
    factorial = 1
    
    # Если num является натуральным, то
    if(num%1==0 and num>=0):
        # Вычисляем факториал числа num
        for i in range(1, num+1):
            factorial = i*factorial
        # Выводим результат на экран
        print(f'{num}! = {factorial}')
    # Если num - отрицательное или нецелое число, выводим сообщение об ошибке
    else:
        print('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    

    У нас появился Telegram-канал для изучающих Python! Подписывайтесь по ссылке: «Кодим на Python! Вместе «питонить» веселее! 😉

    ВАРИАНТ №2: Создаем функцию для вычисления факториала!

    1. Для начала объявим функцию find_factorial(num), которая в качестве аргумента будет принимать число, факториал которого требуется вычислить:

    2. Определяем переменную для хранения текущего значения факториала, присваиваем ей значение «1»:

    def find_factorial(num):
        # определяем начальное значение факториала
        factorial=1
    

    3. Затем, весь написанный в «Варианте №1» код, начиная с проверки на корректность переменной num, помещаем в функцию find_factorial(num). При этом нужно заменить «print» на «return», так как функция ничего не будет выводить на экран, а будет возвращать полученное значение факториала или сообщение об ошибке:

    def find_factorial(num):
        # определяем начальное значение факториала
        factorial=1
        # Если num является натуральным, то
        if(num%1==0 and num >= 0):
            # Вычисляем факториал числа num
            for i in range(1, num+1):
                factorial = i*factorial        
            return (f'{num}! = {factorial}')
        else:
            return ('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    

    Если какой-то момент в коде для Вас не понятен, перечитайте внимательно приведенный выше детальный разбор кода в «Варианте 1»

    4. Осталось только вызвать нашу новую функцию и проверить, корректно ли она работает. Для этого определим число, факториал которого будем считать. Затем вызовем функцию find_factorial() для вычисления факториала числа num. Полученный от функции ответ сохраним в переменной factorial и выведем эту переменную на экран:

    def find_factorial(num):
        # определяем начальное значение факториала
        factorial=1
        # Если num является натуральным, то
        if(num%1==0 and num >= 0):
            # Вычисляем факториал числа num
            for i in range(1, num+1):
                factorial = i*factorial        
            return (f'{num}! = {factorial}')
        else:
            return ('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    
    # Определим число, факториал которого будем считать
    num = 6
    # Вызовем функцию find_factorial() для вычисления факториала  
    factorial = find_factorial(num)
    # Выведем полученный от функции ответ на экран
    print(factorial)
    

    Наша функция отлично работает и может стать полезным ингредиентом в самописной библиотеке для математических вычислений! Однако, мы можем украсить наш код небольшой изюминкой, чем и займемся при рассмотрении «Варианта №3».

    ВАРИАНТ №3: Облагородим код, вычисляющий факториал в Python, строкой пользовательского ввода.

    Давайте добавим скрипту интерактивности — вежливо попросим пользователя ввести число, факториал которого нужно вычислить. Затем, после ввода числа и нажатия пользователем клавиши «Enter», обратимся к функции find_factorial() и выведем результат на экран. Для этого требуется лишь заменить строку, в которой мы задавали значение переменной num, следующей строкой:

    num = eval(input("Факториал какого числа считаем? "))
    

    Функция input() в Python3 позволяет получить введенную пользователем информацию.

    Функция eval() позвляет динамически обновить данные.

    В итоге, обновленный работающий код будет выглядеть так:

    def find_factorial(num):
        # определяем начальное значение факториала
        factorial=1
        # Если num является натуральным, то
        if(num%1==0 and num >= 0):
            # Вычисляем факториал числа num
            for i in range(1, num+1):
                factorial = i*factorial        
            return (f'{num}! = {factorial}')
        else:
            return ('Невозможно вычислить факториал нецелого и/или отрицательного числа!')
    
    # Ввод числа, факториал которого будем считать
    num = eval(input("Факториал какого числа считаем? "))
    # Вызовем функцию find_factorial() для вычисления факториала  
    factorial = find_factorial(num)
    # Выведем полученный от функции ответ на экран
    print(factorial)
    

    Мы рассмотрели 3 варианта, от самого простого, до самого «облагороженного», которые можно использовать для решения задачи по вычислению факториала в Python. Несмотря на то, что эта задача является довольно простой, она отлично подходит для тренировки навыков программирования в Python!

    For performance reasons, please do not use recursion. It would be disastrous.

    def fact(n, total=1):
        while True:
            if n == 1:
                return total
            n, total = n - 1, total * n
    

    Check running results

    cProfile.run('fact(126000)')
    

    4 function calls in 5.164 seconds
    

    Using the stack is convenient (like recursive call), but it comes at a cost: storing detailed information can take up a lot of memory.

    If the stack is high, it means that the computer stores a lot of information about function calls.

    The method only takes up constant memory (like iteration).

    Or using a ‘for’ loop

    def fact(n):
        result = 1
        for i in range(2, n + 1):
            result *= i
        return result
    

    Check running results

    cProfile.run('fact(126000)')
    

    4 function calls in 4.708 seconds
    

    Or using the built-in function math

    def fact(n):
        return math.factorial(n)
    

    Check running results

    cProfile.run('fact(126000)')
    

    5 function calls in 0.272 seconds
    

    Добавить комментарий