Найти тему
Питон и я

Считаем факториал

Источник изображения - собственное
Источник изображения - собственное

Из школьного курса математики вы должны помнить, что такое факториал. Факториалом числа n называют произведение всех целых чисел от 1 до n. Попробуем посчитать его двумя способами.

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

Простой классический способ подсчёта факториала - либо увеличиваем в цикле множители от 2 до n, либо наоборот, уменьшаем. Используем второй вариант.

n = input('Введите целое положительное число n: ')
if x.isnumeric():
t = int(n)
fact = 1
while t > 1:
fact *= t
t -= 1
print(n, '! = ', fact, sep = '')
else:
print(n, 'не является целым положительным числом!')

Что мы делаем? Вначале мы вводим с клавиатуры число, затем сразу проверяем, действительно ли это число. Функция isnumeric() проверяет, содержит ли строка только цифры. Это не помешает нам ввести 005 или 0, но не даст посчитать при вводе отрицательного или дробного числа или строки. Затем мы вначале принимаем результат за единицу и последовательно множим на числа от n до 2. Как только число станет равным 1, вычисления прекратятся. Кстати, попробуйте ввести ноль и самостоятельно посмотреть, что будет.

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

Считать будем следующим способом. Если число больше единицы, значит умножаем его на факториал его же минус один, иначе возвращаем единицу.

def fact(n):
if n > 1:
return n * fact(n - 1)
else:
return 1

n = input('Введите целое положительное число n: ')
if n.isnumeric():
n = int(n)
print(n, '! = ', fact(n), sep = '')
else:
print(n, 'не является целым положительным числом!')

Обратите внимание – в третьей строке функция вызывает себя и передаёт уменьшенный на единицу аргумент. Так будет продолжаться, пока аргумент не станет равным 1.

Учтите, что при слишком больших значениях n приложение может зависнуть. У меня n = 100000 зависания не вызвало, но не гарантирую того же у вас. Всё зависит в первую очередь от объёма памяти.

К рекурсивным алгоритмам мы ещё вернёмся в следующих примерах.

Этот и другие материалы можно найти на нашем сайте Pythonia.SU.

С подпиской рекламы не будет

Подключите Дзен Про за 159 ₽ в месяц