Es. 3. 08/05

Da aptiva.

Ottimo. (ho gradito il controllo di significativita' dell'input)

Io metterei // al posto di / nella riga 5 del codice per avere il valore completo anche con numeri grandi (il coefficiente binomiale e' sempre un numero intero).

Il programma proposto da Franca funziona benissimo:

Coefficiente binomiale

Inserire i numeri di riga e colonna del coefficiente binomiale

Numero di riga (grado del binomio) n 4
Numero di colonna k 2

Il valore del coefficiente binomiale è  6.0

(la parte che segue e' un commento per uno studio avanzato)

L'algoritmo che di solito si usa per calcolare i coefficienti binomiali non usa il fattoriale perche' se si prova con numeri alti il fattoriale genera numeri enormi per i calcoli.

La formula del coefficiente binomiale puo' essere scritta cosi':

(n k)=n!/k!(n-k)!

facendo un po' di conti (al denominatore (n-k)! e' la coda dell'n! al numeratore)

 (n k)=(n*(n-1)*(n-2)* .... *(n-k+1))/(k*(k-1)*(k-2)......*1)

si puo' notare che ci sono k fattori al numeratore e k al denominatore. riordinando i fattori del denominatore da 1 a k e separando in k frazioni diventa:

 (n k)=(n/1)*((n-1)/2)*((n-2)/3)*....*((n-k+1)/k)

... sono k frazioni: la prima e' n/1 e ogni successiva ha come numeratore l'intero precedente e come denominatore l'intero successivo

Es:

 (4 2) = 4/1 * 3/2 = 6 (i fattori sono 2)
 (5 3) = 5/1 * 4/2 * 3/3 = 10 (i fattori sono 3)

Da questa osservazione nasce l'algoritmo per il calcolo del coefficiente binomiale (riportato anche da rosettacode -- ma anche nel codice di rosetta c'e' l'errore di / al posto di //):

def binomialCoeff(n, k):
  result = 1
  for i in range(1, k+1):
    result = result * (n-i+1) // i
  return result

Nota: in questo caso non si puo' scrivere:

 result *= (n-i+1) // i

non funzionerebbe. Occorre fare prima la moltiplicazione poi la divisione result * (n-i+1) e' sempre divisibile per i, (n-i+1) non e' detto che lo sia. In un esempio sopra compare per esempio la frazione 3/2.

La mia funzione e quella proposta da Franca arrivano allo stesso risultato. Se pero' si prova a calcolare il coefficiente (100000 10000) (vi risparmio la risposta che e' un numero di 14116 cifre), il programma proposto da Franca ci mette 7.582 secondi sul mio portatile, il mio 0.882.

30.05 soluzione di Silvia:

def factorial (n):
    if n<2
    return 1
return n*factorial (n-1)
def tartaglia (n,m)
return factorial (n)/(factorial(m)*factorial (n-m)
                      n=input ("n=")
                      m=input ("m=")
                      print tartaglia (m,n)

L'indentazione e' completamente errata... Se provo ad eseguire il programma ottengo:

  File "tartaglia.py", line 2
    if n<2
SyntaxError: invalid syntax

mancano infatti i due punti alla fine dell'if inseriti i due punti ottengo:

  File "tartaglia.py", line 3
    return 1
IndentationError: expected an indented block

e cosi' via. Ho contato:

2 due punti mancanti
1 parentesi mancante
6 indentazioni errate

una media di un errore a riga ;-)

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti