Condizione incomprensibile per me

di Anonimizzato13367 il
8 risposte
Condizione incomprensibile ...

chiedo scusa, come dicevo altre volte, sono un autodidatta.
Non riesco a capire le condizioni di questo esempio(so che || è OR logico e che != è la disguaglianza) ... non capisco cosa sia il %(la divisione?). Qualcuno può spiegarmi le condizioni in linguaggio umano?

ps. a naso però per me l'esempio non funziona, voi che dite? dovrebbe dare false perchè 2,3,4 contengono un numero dispari ...

grazie.

//Controllare se tutti gli elementi di un vettore di interi sono pari
public class Es { 
	public static void main(String[] args) {
		int[] v={2,3,4}; 
		System.out.println(cerca(v,0)); 
		} 
	public static boolean cerca(int[] v,int i) { 
		if ((i>=v.length)||(v[i]%2!=0)) return false;
		else return (v[i]%2==0) || cerca(v, i+1); 

	} 
}

8 Risposte

  • Ciao, % indica il resto della divisione. Spesso viene utilizzato per determinare se un numero è pari o dispari.
    
    if((numero % 2) == 0) pari
    else dispari
    
  • minomic ha scritto:


    Ciao, % indica il resto della divisione. Spesso viene utilizzato per determinare se un numero è pari o dispari.
    
    if((numero % 2) == 0) pari
    else dispari
    
    grazie è un passo avanti ... ora me lo ristudio
  • Ti posto un esempio funzionante e basato su una logica piuttosto semplice. Comunque non mi sembra l'approccio più semplice.
    
    //Controllare se tutti gli elementi di un vettore di interi sono pari
    public class Es { 
    
    
    	public static void main(String[] args) {
    		int[] v = new int[]{2,3,4}; 
    		System.out.println(cerca(v,0)); 
    	} 
    
    
    	public static boolean cerca(int[] v,int i) {
    		if(i == v.length-1 && v[i]%2 == 0) return true;
    		if (v[i]%2!=0) return false;
    		return (cerca(v, i+1)); 
    
    	} 
    }
    
  • Grazie
  • Faccio una piccola correzione a me stesso: questo ottiene gli stessi risultati in modo leggermente più semplice:
    
    //Controllare se tutti gli elementi di un vettore di interi sono pari
    public class Es { 
    
       public static void main(String[] args) {
          int[] v = new int[]{2,3,4}; 
          System.out.println(cerca(v,0)); 
       } 
    
       public static boolean cerca(int[] v,int i) {
          if(i == v.length) return true;
          if (v[i]%2!=0) return false;
          return (cerca(v, i+1)); 
    
       } 
    }
    
    Comunque se dovessi fare un esercizio del genere scriverei semplicemente questa funzione:
    
    public static boolean cerca(int[] v) {
    	   for(int i=0; i<v.length; i++) {
    		   if(v[i]%2 != 0) return false;
    	   }
    	   return true;
       } 
    
  • minomic ha scritto:


    Faccio una piccola correzione a me stesso: questo ottiene gli stessi risultati in modo leggermente più semplice:
    
    //Controllare se tutti gli elementi di un vettore di interi sono pari
    public class Es { 
    
       public static void main(String[] args) {
          int[] v = new int[]{2,3,4}; 
          System.out.println(cerca(v,0)); 
       } 
    
       public static boolean cerca(int[] v,int i) {
          if(i == v.length) return true;
          if (v[i]%2!=0) return false;
          return (cerca(v, i+1)); 
    
       } 
    }
    
    Comunque se dovessi fare un esercizio del genere scriverei semplicemente questa funzione:
    
    public static boolean cerca(int[] v) {
    	   for(int i=0; i<v.length; i++) {
    		   if(v[i]%2 != 0) return false;
    	   }
    	   return true;
       } 
    
    intanto grazie ... un chiarimento:
    il tutto funziona perché nella condizione tutti gli elementi del vettore sono considerati come se fossero un singolo numero?
    perché nel println passiamo zero? sinonimo di pari?
    perché. è necessario un metodo ricorsivo? perché analizza i singoli indici? i+1 serve a questo?

    ciao
  • Rispondo in ordine:
    1. ogni elemento del vettore E' un singolo numero, dato che l'array è un vettore di interi. Se fosse un vettore di stringhe allora ogni elemento sarebbe una stringa e così via
    2. no zero in quel caso non è sinonimo di pari. Passiamo zero per dirgli di cominciare ad analizzare il vettore dall'elemento in posizione 0, cioè dal primo. Se passi 1 la funzione inizia ad analizzare il vettore dalla posizione 1, cioè dal secondo elemento
    3. un metodo ricorsivo non è necessario. Spesso la ricorsione semplifica molto la scrittura del codice ma questo non mi sembra il caso. Infatti ti dicevo che avrei scelto un altro approccio: un semplice ciclo for. Diciamo che volendo utilizzare la ricorsione si può fare come abbiamo visto
    4. all'interno della funzione viene richiamata la funzione stessa (ecco la ricorsione) con l'indice i+1 per dire alla funzione di analizzare l'elemento successivo. Tutto questo continua fino a che non è stato analizzato tutto il vettore. In generale con la ricorsione bisogna fare attenzione alla condizione di uscita, cioè al momento in cui si deve smettere di richiamare la funzione. Nel nostro caso si smette quando è stato analizzato tutto il vettore. Sbagliare la condizione di uscita può portare a loop infiniti, eccezioni o comportamenti non prevedibili (e quindi non desiderabili).
  • Tutto splendidamente chiaro .... grazie!!!
Devi accedere o registrarti per scrivere nel forum
8 risposte