def calculate_factorial(n):
factorial = 1
for i in range(1, n + 1):
factorial *= i
return factorial
print(calculate_factorial(5))
Мне пришлось создать блок кода, который вычисляет факториал любого числа в calculate_factorial(n)
.
Я не понимал, как это сделать, поэтому погуглил ответ, но не было объяснения того, что означает каждая строка.
Я понимаю, что определение calculate_factorial(n)
означает определение calculate_factorial(n)
как переменную и запуск блока при вызове и получении значения, например, в конце блока.
factorial
содержит значение 1
.
в for i in range
есть цикл, (1, n+1)
потому что мне нужны значения от 1
до n
, поскольку последнее число не учитывается.
Я думаю, диапазон 1 раз? Так почему бы это не дать этого? Например, я дал (5), так разве не должно было быть зацикливания (1 раз 1, 1 раз 2, 1 раз 3, 1 раз 4, 1 раз 5)?
возвращает ответ на factorial \*= i
?
factorial *= i
то же, что factorial = factorial * i
Это хорошая возможность для вас начать знакомиться с с помощью отладчика, чтобы пройтись по коду и наблюдать за значениями и результатами каждой отдельной операции.
factorial *= i
— это сокращенное обозначение factorial = factorial * i
. Для каждого элемента i
в диапазоне факториальная переменная обновляется до своего старого значения, умноженного на i.
Например:
Учитывая это n = 5
:
factorial = 1
for i in range(1, n + 1):
factorial *= i
Становится:
factorial = 1
i = 1: factorial_next = factorial_prev * i = 1 * 1 = 1
i = 2: factorial_next = factorial_prev * i = 1 * 2 = 2
i = 3: factorial_next = factorial_prev * i = 2 * 3 = 6
i = 4: factorial_next = factorial_prev * i = 6 * 4 = 24
i = 5: factorial_next = factorial_prev * i = 24 * 5 = 120
Потому что i = n
(второй аргумент range
всегда является исключительным, как вы заметили выше) цикл заканчивается, и функция возвращает 120, что равно 5! (factorial(5)
).
*=
— оператор умножения-присваивания. Он умножает левый и правый операнды и присваивает его обратно переменной в левой части.
Как вы правильно заметили, цикл for
перебирает значения в range(1, n+1)
. Не то чтобы оно не включало последнее значение (в математической записи это будет [1, n+1)
).
Теперь давайте проследим, что происходит с factorial
на протяжении всего цикла.
factorial
— это 1
.i=1
factorial * i
— это 1*1
, т. е. 1
, и это присваивается обратно factorial
i
увеличивается до 2
factorial * i
— это 1*2
, т. е. 2
, и это присваивается обратно factorial
i
увеличивается до 3
factorial * i
— это 2*3
, т. е. 6
, и это присваивается обратно factorial
Если вы сделаете шаг назад и посмотрите, что делает этот цикл, он умножает все числа от 1
до n
и присваивает результат factorial
.
Использовать отладчик?