'''
ARGOMENTI:
---------------------------------------------------------------------
       
    - funzioni
			Una funzione e' una parte di codice separata dal flusso principale. 
			L'importanza, la praticita' e i vantaggi di una funzione stanno 
			nel fatto che può essere "richiamata" in diversi punti del programma 
			di cui fa parte, ogni volta in cui si ha la necessita' di farlo, 
			come se fosse una singola istruzione senza la necessita' di dover 
			riscrivere ogni volta il relativo codice.
			
			Python prevede sia funzioni native del linguaggio che la 
			possibilità di creare funzioni personalizzate. 

			Ad una funzione possono essere passati dei parametri sui quali 
			la funzione dovra' agire  e puo' determinare o meno la restituzione 
			di un valore di ritorno introdotto tramite la keyword return.	
		
	variabili globali e variabili locali
			Tutte le variabili viste finora erano "variabili globali". 
			Le variabili dichiarate all'interno di una funzione sono 
			chiamate "variabili locali", che esistono solamente per la 
			durata della funzione stessa. 
			Quando una variabile locale ha lo stesso nome di una variabile globale, 
			la variabile locale nasconde l'altra variabile. 
			
			Per poter modificare il valore di una variabile globale dall'interno 
			di una funzione, bisogna dichiarare al suo interno la variabile 
			anteponendo la parola chiave "global".



'''
#-----------------------------------------------------------------------
# Nessun parametro - Restituzione di un valore
def f_input1():
    v = int(input("Inserisci il valore: "))
    return v
    
#-----------------------------------------------------------------------
# Nessun parametro - Restituzione di due valori
def f_input2():
    v1 = int(input("Inserisci il PRIMO valore: "))
    v2 = int(input("Inserisci il SECONDO valore: "))
    return v1,v2
    
#-----------------------------------------------------------------------
# Due parametri - Restituzione di due valori
def f_moltiplicazione(a,b):
	return a*b

#-----------------------------------------------------------------------
# Due parametri - Restituzione di due valori
def f_disioneResto(a,b):
    q=a//b
    r=a%b
    return q,r

#-----------------------------------------------------------------------
# Ricorsiva

def f_fattoriale(n):
    if n <= 1:
        return 1
    return n*f_fattoriale(n-1)
    
#-----------------------------------------------------------------------
# Restituzione di una lista

def f_fibonacci(n):
	pre1=1
	pre2=1
	i=0
	seq=[]
	while i<=n-1:
		if i == 0 or i==1:
			seq.append(1)
		else: 
			val=pre1+pre2
			seq.append(val)
			pre2=pre1
			pre1=val
		i=i+1
	return seq
    
#-----------------------------------------------------------------------

selezione = 0
miaLista = []
while selezione != "9":
	print ("\n\n\n")
	print ("------------------------")
	print (" OPERAZIONI")
	print ("------------------------")
	print ("1. Moltiplicazione")
	print ("2. Divisione con resto")
	print ("3. Fattoriale ")
	print ("4. Fibonacci ")
	print ("9. Uscita")
	print ("-----------------------")
	selezione = input("Opzione: ")
	
	

	if selezione == "1":
		a,b=f_input2()
		ris=f_moltiplicazione(a,b)	
		print ("Moltiplicazione:", ris )	
		# oppure
		print ("Moltiplicazione:", f_moltiplicazione(a,b)  ) 						
		
	elif selezione == "2":	
		a,b=f_input2()
		q,r=f_disioneResto(a,b)	
		print ("Quoziente:", q , " - Resto:", r) 	
				

	elif selezione == "3":
		a=f_input1()	
		print ("Risultato:", f_fattoriale(a))
		
	elif selezione == "4":
		a=f_input1()	
		print ("Sequenza:", f_fibonacci(a)) 					
	

	elif selezione == "9":
		print (">>> CIAO!!!!")
		break
		
	else:
		print (" >>> OPZIONE NON VALIDA")
	
	attesa = input("\n >>> Premere INVIO per visualizzare il menu...")
