«Нетиповая ошибка» при попытке вычислить биномиальный коэффициент с использованием факториала из математики

#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))

 

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