
// Variabili locali e ricorsione 

public class Esempio08 {
	static int x;
	
	static void contaFinoA(int y) {
		// Dichiaro una variabile locale
		int z;
		
		// Conto da 0 a y escluso
		z = 0;
		while (z != y) { // z diverso da y
			System.out.println("contaFinoA: " + z);
			z++;
		}
	}
	
	static void altraProcedura(int y) {
		int z;  // Questa z non è in nessun modo correlata 
				// con la z della procedura sopra
		z=y;
		System.out.println("La mia z: " + z);
	}
	
	// Questa è una procedura ricorsiva, cioè che richiama se stessa.
	static void contaRicorsivamente(int inizio, int fine) {
		if (inizio == fine) {
			System.out.println("Finito!");
		} else {
			System.out.println("contaRicorsivamente("+ inizio + ", " + fine +"): conto " + inizio);
			contaRicorsivamente(inizio + 1, fine);
		}
	}
	
	// La stessa procedura di sopra con una modifica subdola!
	static void contaSubdolamente(int inizio, int fine) {
		if (inizio == fine) {
			System.out.println("Finito!");
		} else {
			contaSubdolamente(inizio + 1, fine);
			System.out.println("contaSubdolamente("+ inizio + ", " + fine +"): conto " + inizio);
		}
	}
		
	
	public static void main(String[] args) {
		// Conto da 0 a 10 
		contaFinoA(10);
		
		// Qui la variabile z non è visibile, sarebbe un errore usarla
		
		// Altro conto da 0 a 10
		contaRicorsivamente(0, 10);
		
		// Altro conto
		contaSubdolamente(0, 10);
		
	}

}
