Title: ESERCIZIO 11 (Ricorsione) Post by: kingborn86 on 17-04-2009, 16:16:26 salve a tutti, ho un problemino con questo esercizio!
Code: Scrivere un programma java ricorsivo che riordini un array A di interi, ponendo i valori pari prima di quelli dispari Posto la mia soluzione, anche se non riesco a gestire il caso nel quale il numero sia dispari, e deve essere inserito alla fine dell'array. Non trattandosi di una lista, non ho possibilità di inserire in coda, e la cosa si complica decisamente! Code: public static void riordina ( int [] A, int i, int [] B) { if (i<A.length) { if (A[i] % 2 == 0) { B[i]=A[i]; riordina (int [] A, ++i, int [] B); } else { riordina (int [] A, ++i, int [] B); } } } Title: Re:ESERCIZIO 11 (Ricorsione) Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 18-04-2009, 00:09:52 Posto la mia soluzione
Code: //ordina l'array A in cui le posizioni valide vanno da start (incluso) a end (escluso) //l'utente programmatore lo richiama tramite ordinaPrimaPari (array, 0, array.length); public static void ordinaPrimaPari (int [] A, int start, int end) { //la quantità "end - start" è quella che diminuisce di 1 unità ad ogni passo ricorsivo //il caso base è quando al massimo tra start ed end c'è 1 elemento. if (end - start > 1) { //se il primo elemento è pari, esso è già ordinato e procedo col passo ricorsivo sul resto dell'array if ((A [start] % 2) == 0) ordinaPrimaPari (A, start + 1, end); else { int k = start + 1; //cerca il primo elemento pari a partire da "start" while (k < end && (A [k] % 2) == 1) k++; //se non c'è, sono tutti numeri dispari e l'array è già ordinato if (k < end) { //se c'è, si ricorda di tale numero pari int p = A [k]; //fa scorrere tutti gli elementi dispari da "start" fino a //quel pari di una posizione a destra for (i = k; i > start; i--) A [k] = A [k - 1]; //e mette tale numero pari al primo posto A [start] = p; //infine richiama il metodo ricorsivamente sul resto //dell'array escludendo il primo elemento ordinaPrimaPari (A, start + 1, end); } } } }[/quote] Title: Re:ESERCIZIO 11 (Ricorsione) Post by: Crasher on 18-04-2009, 10:40:24 Ho fatto 2 versioni di questo esercizio...
il primo che è mezzo bubblesort e passo un solo parametro al metodo oppure il secondo un po' + generico. Sapete se il prof accetterebbe il primo? Confermo però che nn è molto ricorsivo, ma di fatto lo è :"-( MAIN Code: public class Esercizio11 { public static void main(String args[]) { int[] A = {1,2,3,4,5,6}; // Stampa for (int i = 0; i<A.length; i++) System.out.print(A[i] + "\t"); // Metodo metodo(A); //metodo(A,0); System.out.println (); // Ristampa for (int i = 0; i<A.length; i++) System.out.print(A[i] + "\t"); } 1° metodo Code: // 2 modi diversi x scrivere lo stesso metodo... public static void metodo(int[] A){ if ( A.length == 0) System.out.println ("Vettore Vuoto!"); else if ( A.length > 1){ // Mezzo BubbleSort for (int i = 0; i<A.length-1; i++) if ( A[i] %2 == 0 && A[i+1] %2 != 0){ int tmp = A[i]; A[i] = A[i+1]; A[i+1] = tmp; metodo (A); } } } 2° metodo Code: /*public static void metodo(int[] A, int i){ if ( A.length == 0) System.out.println ("Vettore Vuoto!"); else if ( A.length > 1 && i<A.length-1){ if ( A[i] %2 == 0 && A[i+1] %2 != 0){ int tmp = A[i]; A[i] = A[i+1]; A[i+1] = tmp; metodo (A,i); } // rifaccio il metodo... nel caso in cui ci siano 2 dispari consecutivi metodo (A,++i); } }*/ } // end class Title: Re:ESERCIZIO 11 (Ricorsione) Post by: Vivynz on 18-04-2009, 11:34:28 io l'ho fatto così però non si mantiene l'ordine dei numeri dispari..anche se il prof stesso ha detto che se non è specificato..possiamo "fare finta di niente" .smile
Code: public static void riordina(int[] array,int da,int a) { if(a-da>0) { if(array[da]%2==0) riordina(array,da+1,a); else { int temp=array[da]; for(int i=da+1;i<a;i++) array[i-1]=array[i]; array[a-1]=temp; riordina(array,da+1,a); } } else return; } |