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)
Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti