PDA

Visualizza la versione completa : [C] Elemento di rango in un vettore


Tallid
21-03-2011, 20:47
MI sono imbattuto in questo esercizio da volgere in linguaggio C, è da ore che ci ragiono :confused: ma non ne vengo a capo qualcuno mi può aiutare? Grazie in anticipo :)

Dato un vettore v di n (>0) interi distinti, definire una funzione ricorsiva rango che dato il vettore, un numero positivo r (1 <= r <= n), restituisce l'elemento di rango r di v, senza ordinare gli elementi.

Un elemento k ha rango r in v se v contiene r elementi minori o uguali a k.

Il prototipo della funzione è:
int rango(int v[], int r, int inf, int sup)

Esempio:
Sia v = [10, -3, -9, 7, -2, 15, -14, 3] e r = 5 allora la chiamata di rango(v, 5, 0, 7) restituirà 3.

VincenzoTheBest
21-03-2011, 21:39
Originariamente inviato da Tallid
MI sono imbattuto in questo esercizio da volgere in linguaggio C, è da ore che ci ragiono :confused: ma non ne vengo a capo qualcuno mi può aiutare? Grazie in anticipo :)
Cosa non riesci a fare esattamente?
Riesci a trovare almeno una soluzione iterativa al problema rispettando il prototipo?

Tallid
21-03-2011, 21:47
si una soluzione iterattiva la trovo basta fare 2 cicli for annidati, uno che scorre il vettore e l'altro che setta il prossimo elemento da analizzare, però ricorsivamente non riesco a scorrere gli elementi perchè avrei bisogno di un ulteriore parametro...

VincenzoTheBest
21-03-2011, 21:52
Originariamente inviato da Tallid
avrei bisogno di un ulteriore parametro...
E quale sarebbe?

Tallid
21-03-2011, 21:56
beh un prototipo potrebbe essere questo:

int rango(int v[],int r, int inf, int sup,int cursor){

//scorro il vettore partendo dall elemento inferiore
int count=0;
for(int i;i<=sup;i++){
if(v[cursor]>=v[i])count++;
}
if(count=r)return v[cursor];//l' elmento è del rango dato
else {
if(cursor==sup)return 0;//nessun elemento di rango dato
cursor++;
return rango(v,r,inf,sup,cursor);//passo al prossimo elmento

}
}
con la variabile cursor riesco a tenere traccia dell' elemento da valutare

VincenzoTheBest
21-03-2011, 21:57
Originariamente inviato da Tallid
beh un prototipo potrebbe essere questo:

int rango(int v[],int r, int inf, int sup){
}

Questo prototipo te lo fornisce la fonte dell'esercizio? Se così non è, allora potresti anche definirla diversamente..

Tallid
21-03-2011, 22:01
scusa ho appena modificato

Tallid
21-03-2011, 22:06
Originariamente inviato da VincenzoTheBest
Questo prototipo te lo fornisce la fonte dell'esercizio? Se così non è, allora potresti anche definirla diversamente..

Si la funzione deve avere quella firma

VincenzoTheBest
21-03-2011, 22:10
Originariamente inviato da Tallid
Si la funzione deve avere quella firma
Allora devi incrementare inf.
Quando inf > sup allora il vettore non ha il rango. Ciò ti garantisce di uscire dalla funzione anche nel caso in cui non dovrebbe esserci un elemento rango.

Tallid
21-03-2011, 22:12
Originariamente inviato da VincenzoTheBest
Allora devi incrementare inf.
Quando inf > sup allora il vettore non ha il rango. Ciò ti garantisce di uscire dalla funzione anche nel caso in cui non dovrebbe esserci un elemento rango.
incrementando inf perdo il riferimento al primo elemento

Loading