Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 2, 9 CFU => Topic started by: kingborn86 on 17-04-2009, 16:16:26



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;
}