#python #math #factorial #nonetype #binomial-coefficients
Вопрос:
Чтобы продемонстрировать ошибку переполнения по отношению к биномиальным коэффициентам, я написал этот код в попытке вычислить биномиальные коэффициенты.
Я почти уверен, что это математически правильно, но по какой-то причине я получаю следующую ошибку:
File "C:/Users(...)/binominal coeffesient.py", line 15, in <module>
print(f"n = {n} k = {k}t{binomial(n,k)}")
File "C:/Users/(....)/binominal coeffesient.py", line 10, in binomial
return factorial(n)/(factorial(n)*factorial(n-k))
TypeError: unsupported operand type(s) for *: 'NoneType' and 'NoneType'
Код, о котором идет речь, является:
def factorial(n):
prod = 1
for i in range(1, n 1):
prod *= i
print(prod)
def binomial(n, k):
return factorial(n)/(factorial(k)*factorial(n-k))
for n in range(0,4):
for k in range(0, n 1):
print(f"n = {n} k = {k}t{binomial(n,k)}")
Стоит отметить, что в моей IDE, Pycharm выделяет оператор умножения * и оператор деления / в функции «биномиальный(n, k)»
Есть кто-нибудь, кто может помочь мне это исправить?
Комментарии:
1. Вы не возвращаете никакого значения из
factorial
функции. Вы также хотите использовать целочисленное деление (//
) вместо истинного деления (/
) в своейbinomial
функции, но это не связано с ошибкой, о которой вы сообщаете.2. @MarkDickinson: Я все еще благодарен за помощь:-) Спасибо, что указали на это!
3. Также обратите внимание, что факториалы быстро становятся очень большими, вызывая ошибки аппроксимации и даже переполнения. Альтернативный расчет позволяет избежать больших чисел, например
prod=1; for i in range(k): prod=prod*(n-i)//(i 1)
4. @johanC: Вы абсолютно правы! Я пишу задание именно на эту тему, поэтому я пишу этот код в качестве примера того, как вы не должны решать такого рода проблемы:-)
Ответ №1:
Если кто — то в будущем может задаться вопросом, как жестко закодировать факториальную или биномиальную функцию, это один из способов сделать это-даже если он, вероятно, не самый лучший.
(Очень ошибка новичка) заключалась в том, что я забыл удалить оператор печати, который я использовал для тестирования факториальной функции, где, очевидно, вместо него был оператор возврата.
Кроме того, разделение всего числа ( // ) было желанным улучшением исходного кода.
В любом случае, спасибо всем, кто помог, указал на мои ошибки и помог мне их исправить.
Это и есть решение:
def factorial(n):
prod = 1
for i in range(1, n 1):
prod *= i
return prod
def binomial(n, k):
return (factorial(n)//(factorial(k)*(factorial(n-k))))
print(binomial(10,5))
Если вы планируете использовать это, пожалуйста, обратите внимание, что оно не работает для больших чисел. Хотя он отлично работает для небольших чисел, весь смысл написания этого кода состоял в том, чтобы продемонстрировать, что он вызывает ошибки при больших вычислениях.