2015-07-16 16 views
10

Ho codice che sta calcolando i numeri catalani con il metodo dei coefficienti binominali.Python che calcola i numeri catalani

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

Ho un risultato "nan" quando si tenta di calcolare il numero catalana, che n è più di 510. Perché questo sta accadendo? E come posso risolverlo?

+0

Si ottiene 'nan' perché' BinominalCoefficient (1022, 511) 'restituisce' inf'. –

+0

Stai usando Python 3? In tal caso, utilizzare la divisione intera '//' per evitare i float (non sono comunque necessari per questo calcolo). –

+0

Quale versione di Python stai usando? Ottengo risultati corretti sia in Python 2.6.6 che in Python 3.4.3 –

risposta

9

presumo che si sta utilizzando Python 3.

tuo res /= (i + 1) dovrebbe essere res //= (i + 1) per forzare aritmetica intera:

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

rendimenti

2190251491739477424254235019785597839694676372955883183976582551028726151813997871354391075304454574949251922785248583970189394756782256529178824038918189668852236486561863197470752363343641524451529091938039960955474280081989297135147411990495428867310575974835605457151854594468879961981363032236839645 

Si ottiene nan perché la divisone/= in Python 3 restituisce un float che trabocca a inf.

+0

Grazie, lavora per me. – Reodont

Problemi correlati