PDA

Visualizza la versione completa : [C] - Occorrenze in un vettore con funzione Ricorsiva


bard0x
21-01-2013, 19:02
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 !


#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);

}
}
}

Scara95
21-01-2013, 19:55
#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;
}

Alex'87
21-01-2013, 20:53
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?

bard0x
21-01-2013, 20:54
Originariamente inviato da Scara95

#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));

??

Scara95
21-01-2013, 21:28
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)
)

bard0x
21-01-2013, 21:30
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...

Scara95
21-01-2013, 21:35
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...

bard0x
21-01-2013, 22:00
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

Scara95
21-01-2013, 22:09
Certo si potrebbe convertire in un if esplicito, ma in questo caso dovresti riscrivere due volte:

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...

Alex'87
21-01-2013, 22:16
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:



int x = a == b ? 10 : 20;


equivalente a



int x;
if (a == b) {
x = 10;
} else {
x = 20;
}


:ciauz:

Loading