Ricorsione su vettori

di il
12 risposte

Ricorsione su vettori

Buonasera , ho iniziato soltanto ieri a studiare la ricorsione e mi servirebbe un aiuto su un esercizio, sto riscontrando molte difficoltà sull'argomento. Per capire come ragionare l'ho svolto prima in modo iterativo e poi ho provato a farlo in modo ricorsivo. L'esericizio chiede: "Assegnato un vettore D di dimensione N, scrivere una funzione ricorsiva che calcoli il minimo valore tra la differenza di ogni elemento con il precedente (escluso il primo)". Quindi dato per esempio questo vettore:
4 7 8 5 9
La funzione dovrebbe verificare:
5-9=-4
8-5=3
7-8=-1
4-7=-3
e restituire -4.
In modo iterativo ricevo la giusta soluzione, in modo ricorsivo no . Ecco il codice:
/*ITERATIVA*/
int minore(int *v, int dim){
int min=0, dif, i;

 for(i=dim-2; i>=0; i--){
  dif=v[i]-v[i+1];
   if(dif<min){
    min=dif;
   }
 }
return min;
}

/*RICORSIVA*/
int minore2(int *v, int dim, int min){

 if(dim>0){
  if(v[dim-2]-v[dim-1]<minore2(v,--dim, (v[dim-2]-v[dim-1])));
   min=(v[dim-2]-v[dim-1]);
 }
 else
  return min;
}

12 Risposte

  • Re: Ricorsione su vettori

    int minore(int *v, int dim){
        int min,dif,i;
        for(i=1; i<dim; i++){
                 if(i==1)min=v[i]-v[i-1];
                 dif=v[i]-v[i-1];
                 if(dif<min){
                             min=dif;
                 }
     }
    return min;
    }
    
    int minore2(int *v, int dim, int min){
     if(dim>1){
      if(v[dim]-v[dim-1]<minore2(v,--dim, (v[dim]-v[dim-1])));
       min=(v[dim]-v[dim-1]);
     }
     else
      return min;
    }
    Comunque credo che hai interpretato male il titolo, dovresti far la differenza tra ogni valore ed il precedente, non il successivo..dimmi se ti da problemi la soluzione che ti ho scritto
  • Re: Ricorsione su vettori

    La tua soluzione ha la bellezza di Frankestein: e' un mix di ricorsione ed iterazione (ed inutilmente complicata).

    Sei sicuro che funziona?

    Se vuoi proporre una soluzione (cosa vietata dalle regole del forum), almeno che sia elegante e semplice!!!
  • Re: Ricorsione su vettori

    klizard ha scritto:


    Comunque credo che hai interpretato male il titolo, dovresti far la differenza tra ogni valore ed il precedente, non il successivo..dimmi se ti da problemi la soluzione che ti ho scritto
    In realtà avevo interpretato l'esercizio come hai fatto tu ed inizialmente avevo svolto l'esercizio iterativo proprio come la tua soluzione, ma in una soluzione di un ragazzo che ha seguito le lezioni all'università ho visto l'esempio che ho postato perché con molta probabilità quell'esempio è stato proposto dal docente durante una "spiegazione", così ho cambiato il codice e cercato di svolgerlo applicando quel ragionamento.
  • Re: Ricorsione su vettori

    Applicando quel ragionamento vorrei riuscire a comprendere meglio cosa non funziona nel mio codice anche perché essendo alle prime armi faccio molta a fatica a trovare subito la soluzione ricorsiva
  • Re: Ricorsione su vettori

    La ricorsione è molto difficile da capire. Quello che posso suggerirti è di inserire delle stampe a video di quello che succede, magari semplicemente l'entrata nella funzione, con gli argomenti che riceve, e l'uscita dalla funzione. Prova con una semplice funzione che calcola ad esempio il fattoriale, otterrai a video una specie di matrioska ; fai poi la stessa cosa con l'algoritmo che non capisci e vedrai che ne verrai a capo.
  • Re: Ricorsione su vettori

    L'esercizio sul fattoriale sono riuscita a comprendere sia cosa fa il codice e sia cosa succede in memoria. Ma ogni esercizio è sempre diverso dall'altro quindi le difficoltà che ho incontrato non sono poche . Adesso proverò a seguire il tuo consiglio e vediamo se riesco a trovare una soluzione
  • Re: Ricorsione su vettori

    Per la ricorsione devi ragionare da "matematico": nel tuo caso la funzione che devi scrivere, chiamiamola f(D,N) è questa
    
                 se N=2      D[0]-D[1]
    f(D,N)  
                 se N>2      min( D[0]-D[1], f(&D[1],N-1) )
    
  • Re: Ricorsione su vettori

    random_95 ha scritto:


    klizard ha scritto:


    Comunque credo che hai interpretato male il titolo, dovresti far la differenza tra ogni valore ed il precedente, non il successivo..dimmi se ti da problemi la soluzione che ti ho scritto
    Ho provato a farlo in questo modo e sono riuscita a farlo sia in modo iterativo che ricorsivo . Per esercitarmi adesso provo a svolgerlo secondo il ragionamento del professore e seguendo il tuo consiglio

    candaluar ha scritto:


    Per la ricorsione devi ragionare da "matematico": nel tuo caso la funzione che devi scrivere, chiamiamola f(D,N) è questa
    
                 se N=2      D[0]-D[1]
    f(D,N)  
                 se N>2      min( D[0]-D[1], f(&D[1],N-1) )
    
    Grazie per l'aiuto
  • Re: Ricorsione su vettori

    E se N<2?
  • Re: Ricorsione su vettori

    Ciao +m+, il dominio della funzione è rappresentato da tutti gli interi >= 2.
    Nell'implementazione, naturalmente, dovranno essere sviluppati i controlli di consistenza del caso.
  • Re: Ricorsione su vettori

    candaluar ha scritto:


    Ciao +m+, il dominio della funzione è rappresentato da tutti gli interi >= 2.
    Nell'implementazione, naturalmente, dovranno essere sviluppati i controlli di consistenza del caso.
    "dominio" non ha un significato preciso, per l'informatica (o meglio ce l'ha, ma è complesso).
    Non esaurire il dominio "da codice" implica la necessità di utilizzare asserzioni (o qualcosa di analogo, dipende se parliamo di C o C++ e di quale versione)
  • Re: Ricorsione su vettori

    Non esaurire il dominio "da codice" implica la necessità di utilizzare asserzioni (o qualcosa di analogo, dipende se parliamo di C o C++ e di quale versione)
    Credo che basti una semplice if prima di eseguire la prima chiamata
Devi accedere o registrarti per scrivere nel forum
12 risposte