2015-07-16 21 views
10

Mam kod, który oblicza liczby katalońskie metodą współczynników binominalnych.Python obliczanie liczb katalońskich

def BinominalCoefficient(n,k): 
    res = 1; 
    if (k > n - k): 
     k = n - k 
    for i in range(k): 
     res *= (n - i) 
     res /= (i + 1) 
    return res 
def CatalanNumbers(n): 
    c = BinominalCoefficient(2*n, n) 
    return (c//(n+1)) 
print (CatalanNumbers(510)) 

Mam „nan” Wynik gdy próbuję obliczyć liczbę katalońskiej którym n wynosi ponad 510. Dlaczego tak się dzieje? I jak mogę to rozwiązać?

+0

Otrzymujesz 'nan', ponieważ' BinominalCoefficient (1022, 511) 'zwraca' inf'. –

+0

Czy używasz Pythona 3? Jeśli tak, użyj podziału liczb całkowitych '//', aby uniknąć pływaków (i tak nie potrzebujesz ich do tego obliczenia). –

+0

Jakiej wersji pythonu używasz? Dostaję poprawne wyniki zarówno w pythonie 2.6.6, jak iw pythonie 3.4.3 –

Odpowiedz

9

Zakładam, że używasz Python 3.

Twój res /= (i + 1) powinny być res //= (i + 1) zmusić arytmetyki liczb całkowitych:

def BinominalCoefficient(n,k): 
    res = 1 
    if (k > n - k): 
     k = n - k 
    for i in range(k): 
     res *= (n - i) 
     res //= (i + 1) 
    return res 
def CatalanNumbers(n): 
    c = BinominalCoefficient(2*n, n) 
    return (c//(n+1)) 
print (CatalanNumbers(511)) 

powraca

2190251491739477424254235019785597839694676372955883183976582551028726151813997871354391075304454574949251922785248583970189394756782256529178824038918189668852236486561863197470752363343641524451529091938039960955474280081989297135147411990495428867310575974835605457151854594468879961981363032236839645 

Dostajesz nan bo dywizja/= w Pythonie 3 zwraca zmienną, która przepełnia się do inf.

+0

Dzięki, działa dla mnie. – Reodont