Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12

    [C] - Occorrenze in un vettore con funzione Ricorsiva

    Ciao ragazzi, devo scrivere un programma che sia in grado di contare le occorrenze di un valore all'interno di un vettore,tutto questo mediante una funzione ricorsiva... Purtroppo Sto avendo dei problemi posto qui il codice , grazie in anticipo per le eventuali risposte !

    codice:
    #include <stdio.h> 
    #define SIZE 20  
               
               int ricorsivo (int dimensione,int vettore[SIZE],int ricerca1,int conta);
    
     main() {        
                  int vettore1[SIZE],i,cont=0,ricerca,dim; 
                  printf("Determina la dimensione del vettore:");
                  scanf("%d",&dim);  
                  system("cls");  
                  for(i=0;i<dim;i++) 
                      { 
                          printf("Elemento:"); 
                          scanf("%d",&vettore1[i]);                  
                      } 
                  printf("Inserisci il valore per ricercare l'occorrenza:");
                  scanf("%d",&ricerca);
                  printf("\nIl valore e' presente %d volte\n",ricorsivo(dim,vettore1,ricerca,cont));          
                 system("pause");      
               } 
    
      int ricorsivo(int dimensione,int vettore[SIZE],int ricerca1,int conta)
     { 
        int i; 
        for(i=0;i<dimensione;i++) 
            {
               if(vettore[i]!=ricerca1) 
                    {
                        return 0;               
                    }      
               if(vettore[i]==ricerca1) 
                        { 
                              conta++;
                              return ricorsivo(dimensione,vettore,ricerca1,conta);      
              
                        }    
             }   
      }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <stdio.h>
     
    #define ASIZE(a) (sizeof(a)/sizeof(a[0]))
     
    int ocorrenze(int size, int * vettore, int find, int count) {
      if(size <= 0)
        return count;
      return ocorrenze(size - 1, vettore, find, count + ((find == vettore[size - 1]) ? 1 : 0));
    }
     
    int main() {
        int a[5] = {2, 0, 2, 3, 2};
        printf("%d", ocorrenze(ASIZE(a), a, 2, 0));
        return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: [C] - Occorrenze in un vettore con funzione Ricorsiva

    Originariamente inviato da bard0x
    Purtroppo Sto avendo dei problemi posto qui il codice , grazie in anticipo per le eventuali risposte !
    Che problemi? Non compila? Errore a runtime? Non restituisce il risultato che ti aspetti?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12
    Originariamente inviato da Scara95
    codice:
    #include <stdio.h>
     
    #define ASIZE(a) (sizeof(a)/sizeof(a[0]))
     
    int ocorrenze(int size, int * vettore, int find, int count) {
      if(size <= 0)
        return count;
      return ocorrenze(size - 1, vettore, find, count + ((find == vettore[size - 1]) ? 1 : 0));
    }
     
    int main() {
        int a[5] = {2, 0, 2, 3, 2};
        printf("%d", ocorrenze(ASIZE(a), a, 2, 0));
        return 0;
    }

    Grazie sei stato gentilissimo, in effetti funge ! Ti posso chiedere se brevemente puoi spiegarmi
    return ocorrenze(size - 1, vettore, find, count + ((find == vettore[size - 1]) ? 1 : 0));

    ??

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    return => restituisce il risultato dell funzione
    ocorrenze(
    size - 1 => ho controllato l'ultimo elemento, posso non considerarlo più e "diminuire le dimensioni del mio array" (diminuire per modo di dire)
    vettore => l'indirizzo al vettore
    find => l'elemento da trovare
    count + ((find == vettore[size - 1]) ? 1 : 0) => il numero di elementi già trovati + (se l'elemento da trovare è uguale all'ultimo elemento dell'array 1 altrimenti 0)
    )
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12

    Re: Re: [C] - Occorrenze in un vettore con funzione Ricorsiva

    Originariamente inviato da Alex'87
    Che problemi? Non compila? Errore a runtime? Non restituisce il risultato che ti aspetti?
    In effetti non restituiva il risultato che mi aspettavo... Col codice di Scara95 ho risolto il problema ma non ho cmq capito in teoria cosa ha fatto...

  7. #7
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    La funzione prende il vettore e la sua dimensione, se il vettore a 0 elementi ritorna il numero di elementi uguali contati, altrimenti controlla l'ultimo elemento dell'array e se è uguale all'elemento da trovare aumenta il count di 1 e richiama se stessa dicendo che l'array or ha un elemento in meno (ho controllato l'ultimo) e passando il nuovo count degli elementi....

    In sostanza controlla sempre l'ultimo elemento e per gli altri richiama sè stessa chiedendo di controllare l'elemento subito prima...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2013
    Messaggi
    12
    Originariamente inviato da Scara95
    La funzione prende il vettore e la sua dimensione, se il vettore a 0 elementi ritorna il numero di elementi uguali contati, altrimenti controlla l'ultimo elemento dell'array e se è uguale all'elemento da trovare aumenta il count di 1 e richiama se stessa dicendo che l'array or ha un elemento in meno (ho controllato l'ultimo) e passando il nuovo count degli elementi....

    In sostanza controlla sempre l'ultimo elemento e per gli altri richiama sè stessa chiedendo di controllare l'elemento subito prima...

    Ma per quanto riguarda ((ricerca1==vettore[dimensione-1])? 1 : 0 ,questo si potrebbe convertire esplicitamente nell if then else senza usare l'operatore "?" ? Tuttavia grazie mille sei stato chiarissimo in ogni dettaglio ! Sei un grande

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Certo si potrebbe convertire in un if esplicito, ma in questo caso dovresti riscrivere due volte:
    codice:
    if(vettore[size-1] == find)
      return ocorrenze(size -1, vettore, find, count+1);
    else
      return ocorrenze(size -1, vettore, find, count);
    inquanto i'if/else non può essere utilizzato come espressione, per quello ho optato per l'operatore ? : che può essere usato come tale, ho risparmiato qualche riga di codice...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da bard0x
    Ma per quanto riguarda ((ricerca1==vettore[dimensione-1])? 1 : 0 ,questo si potrebbe convertire esplicitamente nell if then else senza usare l'operatore "?" ? Tuttavia grazie mille sei stato chiarissimo in ogni dettaglio ! Sei un grande
    Sì. ?: (operatore ternario condizionale, detto anche "Elvis operator") è un if particolare:

    codice:
    int x = a == b ? 10 : 20;
    è equivalente a

    codice:
    int x;
    if (a == b) {
      x = 10;
    } else {
      x = 20;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.