Es. 9. 15/05
Da aptiva.
La soluzione di Runa risolve effettivamente il problema.
def Triang (somma, contatore, verif): contatore += 1 somma += contatore if somma < verif: b= Triang (somma, contatore, verif) return b elif somma == verif: return True else: return False numContr = int(raw_input("Inserire il numero da controllare\t")) verificato = Triang (0, 0, numContr) if verificato: print ("Il numero inserito e' Triangolare") else: print ("Il numero inserito NON e' Triangolare")
Prendo spunto per indicare come migliorare lo stile di programmazione. Per controllare se un numero e' triangolare ci si aspetta che la funzione abbia un solo parametro, ma al metodo ricorsivo qui realizzato ne servono tre. Ci vuole una funzione intermedia che faccia da "attivatore" della Triang.
def Triang(verif): def rtriang (somma, contatore, verif): contatore += 1 somma += contatore if somma < verif: return rtriang (somma, contatore, verif) elif somma == verif: return True else: return False return rtriang(0,0,verif) numContr = int(input("Inserire il numero da controllare\t")) verificato = Triang (numContr) if verificato: print ("Il numero inserito e' Triangolare") else: print ("Il numero inserito NON e' Triangolare")
In questo modo:
- chi usera' la Triang non deve ricordare di aggiungere strani parametri che servono solo per l'implementazione
- e' chiaro che la rtriang e' locale, utile solo al calcolo della Triang, e non deve essere richiamata come funzione a se' stante.
... in questo caso e' piu' comodo sottrarre che sommare. Ecco la mia soluzione:
def triang(val): def rtriang(n,val): if val==0: return True elif n>val: return False else: return rtriang(n+1,val-n) return rtriang(0,val)