Esercizio su ricorsione

Messaggioda Michele/96 » 08/06/2017, 16:04

Salve a tutti, ho da pochi minuti svolto il seguente esercizio:


* Scrivere un metodo ricorsivo exDue con le seguenti caratteristiche:
* a) exDue lavora su un array a passato per riferimento;
* b) exDue restituisce l'array a, modificato in modo che:
* 1) tutti e soli gli elementi di a per cui il metodo test dato e' vero siano incrementati di 1;
* 2) l'indice che guida la ricorsione CRESCA durante le chiamate ricorsive.
*
* ESEMPI.
* Se b-->{0, 2, 5, 1, 4} allora exDue(b) restituisce b-->{0, 3, 6, 1, 4}.
* Se b-->{2, 5, 8} allora exUno(b) restituisce b-->{3, 6, 9}.
* Se b-->{2} allora exUno(b) restituisce b-->{3}.
* Se b-->{1} allora exUno(b) restituisce b-->{1}.
* Se b-->{} allora exUno(b) restituisce b-->{}.

Il metodo test dato è il seguente:
Codice:
 private static boolean test(int x) {
           return (x % 3 == 2);
   }


La mia soluzione è la seguente:

Codice:
public static int[] exDue(int[] a){
      int i=0;
      if(a!=null){
         return exDueRic(a,i);
      }
      else{
         return null;
      }
   }
   public static int[] exDueRic(int[] a,int i){
      if(i<a.length){
         if(test(a[i])==true){
            a[i]++;            
         }
         return exDueRic(a,i+1);
      }
      else{
         return a;
      }
   }


Quello che mi chiedo è:"sarebbe possibile svolgere tale esercizio senza richiamare metodi di supporto e/o passare come
parametro formale l' indice che guida la ricorsione?"
Ringraziamenti anticipati a chiunque sappia darmi una risposta!!
Saluti :-)
Michele/96
New Member
New Member
 
Messaggio: 23 di 70
Iscritto il: 22/10/2016, 12:24

Re: Esercizio su ricorsione

Messaggioda apatriarca » 08/06/2017, 20:43

Non usando il linguaggio che stai utilizzando (che suppongo sia Java?) o non usando gli array. Sarebbe possibile se il linguaggio supportasse argomenti di default (come in C++) e se quindi facessi qualcosa come il seguente (non restituisco alcun valore che l'array viene comunque modificato in place):
Codice:
void exDue(std::vector<int> &a, int i = 0)
{
    if (i >= a.size()) { return; }
    if (test(a[i]) { ++a[i]; }
    exDue(a, i+1);
}

In alternativa è possibile usando iteratori invece che array. Per esempio:
Codice:
public static void exDue(ListIterator<int> it)
{
    if (!it.hasNext()) { return; }
    int value = it.next();
    if (test(value)) { it.set(value + 1); }
    exDue(it);
}


Ovviamente tutto questo è un inutile esercizio in quanto in pratica nessuno userebbe un metodo ricorsivo per una cosa del genere in un linguaggio come questi.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4660 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio su ricorsione

Messaggioda Michele/96 » 10/06/2017, 18:23

Anzitutto ti ringrazio per la risposta, in secondo luogo sono pienamente d' accordo, è un esercizio finalizzato a comprendere certi meccanismi(credo), da un punto di vista pratico cose del genere si possono ottenere con molto meno, ma questo è l' esercizio ;-)
Saluti.
Michele/96
New Member
New Member
 
Messaggio: 24 di 70
Iscritto il: 22/10/2016, 12:24


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite