Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Ricorsione

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2015
    residenza
    Italia
    Messaggi
    23

    [C] Ricorsione

    Buongiorno ,
    e' da ieri che cerco di trovare l'errore in questo programma ma non riuscendo a giungere ad una soluzione. L'esercizio chiede di creare una funzione ricorsiva che invertire gli elementi in un array di interi. Io l'ho svolto in questo modo, ma a quanto pare sono presenti degli errori poiché non riesce a stamparmi il vettore invertito:
    codice:
    void visualizza(int *, int);
    void inverti(int *, int);
    void inverti(int *, int);
    
    int main(){
    int v[20], dim, i;
    
    
     do{
       printf("Quanti elementi vuoi inserire nel vettore? (massimo 20)\n");
       scanf("%d", &dim);
    
    
        if(dim<1 || dim>20){
         printf("ERRORE nell'inserimento dei dati!\n");
        }
     }while(dim<1 || dim>20);
    
    
     printf("Inserisci elementi:\n");
      for(i=0; i<dim; i++){
        scanf("%d", &v[i]);
      }
    
    
     printf("Il vettore inserito e' il suguente:\n");
     visualizza(v, dim);
    
    
      inverti(v, dim-1);
      printf("\n\nIl vettore invertito e' il suguente:\n");
      visualizza(v, dim);
    
    
    system("pause");
    return 0;
    }
    
    
    void visualizza(int *v, int dim){
    int i;
    
    
     for(i=0; i<dim; i++){
      printf("%d\t", v[i]);
     }
    
    
    }
    
    
    void scambia (int *a, int *b) {
      int c;
      c = *a;
      *a = *b;
      *b = c;
    }
    
    
    void inverti(int *p, int dim){
    int i;
    int j=p[i]+1;
    int aus;
    
    
    if(dim==1){
     *p;
    }
    
    
    if (dim>1){
     scambia(p, p+dim);
     inverti(p+1, dim-1);
     }
    }
    Ultima modifica di melmang; 22-06-2015 a 11:20

  2. #2
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ciao, ci sono un paio di cose che non vanno.
    A scambia dovresti passargli il puntatore al primo e all' ultimo elemento della porzione di array da analizzare. p è il primo, ma l'ultimo sei sicuro che sia p + dim? ricorda che gli indici partono da 0; Es dim = 5, p = 0, l'ultimo elemento è un posizione 4 e non 5.
    A questo punto riapplichi ricorsivamente lo stesso regionamento alla sotto sequenza non considerando il primo e l'ultimo elemento, quindi la dimensione non diminuisce di 1 ma bensi di ...
    Inoltre i, j, aus e if(dim == 1) non ti servono.
    Infine nel main devi passare la dimensione effettiva dell' array (non decrementata di 1).

    PS, se al posto di usare la ricorsione in coda usassi quella in testa, potresti scrivere la stessa funzione con meno istruzioni e senza bisogno di metodi ausiliari
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2015
    residenza
    Italia
    Messaggi
    23
    i, j, aus erano di un vecchia prova che avevo effettuato e ho dimenticato ad eliminarlo. La condizione if(dim == 1) pensavo di utilizzarlo come caso base. Per la chiamata ricorsiva scambia(p, p+dim) non ero molto sicura infatti da quello che ho intuito è errato e dal tuo ragionamento sugli indici dovrei passare la dimensione decrementata giusto? Invece nell'altra chiamata ricorsiva dovrei passare la dimensione decrementata di due: inverti(p+1, dim-2);

  4. #4
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    dovrei passare la dimensione decrementata giusto?
    Esatto, p + dim - 1
    La condizione if(dim == 1) pensavo di utilizzarlo come caso base
    Se vuoi esplicitare il caso base dovresti scrivere qualcosa del genere:
    codice:
    void inverti(int *p, int dim){
        if(dim == 1){
            return;
        }
        scambia(p, p + dim - 1);
        inverti(p + 1, dim - 2);
    }
    ma dato che è una funzione void puoi riscriverla così:
    codice:
    void inverti(int *p, int dim){
        if (dim > 1){
            scambia(p, p + dim - 1);
            inverti(p + 1, dim - 2);
        }
    }
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2015
    residenza
    Italia
    Messaggi
    23
    Ti ringrazio per l'aiuto!

  6. #6
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Figurati
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.