|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
[C] Ricorsione ordinamento vettore
Allora, devo scrivere una funzione che restituisca 1 se il vettore è ordinato in modo crescente, -1 se è ordinato im modo decrescente e 0 se gli elementi stanno a caso.
con la RICORSIONE buttate giu qualche idea, intanto ci penso anc'ìhio |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho abbozzato questo ma non sembra avere molto senso
Codice HTML:
int ordinato(int vett[], int n){
if(n=1){return 0;}
if(a[n-1]>a[n-2){return 1;}
else return ordinato(int vett[], n-1);}
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Devi espandere un pochino il tema.
Per esempio, la tua funzione restituisce: 1 - se il vettore e' ordinato in modo crescente; -1 - se il vettore e' ordinato in modo decrescente; 0 - se il vettore non e' ordinato; -2 - se il vettore e' formato da elementi finora uguali. il senso del risultato -2 e' che altrimenti non puoi stabilire l'ordine di vettori i cui primi elementi sono tutti uguali, ma dovrai rimandare la decisione fino a quando troverai un elemento diverso. Usando questa considerazione, scriverai una funzione int getOrder (int *vect, int n) dove vect e' il tuo vettore ed n e' il numero di elementi ivi contenuti. Potrai "giocare" con n al fine di ridurre la dimensione del vettore fino al/ai casi base. BASE: - se n <= 1 (quindi 0 o 1 elemento), ritornerai -2 (tutti elementi uguali, finora); - se n == 2, ritornerai i corrispondenti confronti PASSO RICORSIVO - se n > 2, allora - chiami ricorsivamente getOrder (vect, n-1). Otterrai un risultato compreso fra {-1, 1, 0, -2}; - confronti gli elementi vect[n-2] e vect[n-1], ed il risultato lo confronti con quanto riportato dalla chiamata ricorsiva. C'est tout
__________________
In God we trust; all others bring data |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ci provo
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Bene. Ho realizzato un piccolo codice per provare che funzionasse, se ti serve lo posto
__________________
In God we trust; all others bring data |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ho provato a scrivere questo ma non so cosa ci va al posto di if(n==2)
Codice HTML:
int ordinamento(int vett[], int n){
if(n<=1){
return -2;}
if(n==2){
if(n>2){
ordinamento(int vett[], int n-1);}
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ciao,
anche il caso n > 2 deve essere controllato. Comunque parliamo ora del caso n == 2. Io farei i confronti (tutti) fra gli unici due elementi che compongono il vettore: - se vect[0] > vect[1] ritorna -1 (ordinato in modo decrescente) - se vect[0] < vect[1] ritorna 1 (ordinato in modo crescente) - se vect[0] == vect[1] ritorna -2 (vettore con tutti elementi uguali) Ovviamente non hai il caso di vettore non ordinato, visto che contiene solo due elementi, i quali possono essere solo uguali o diversi fra loro e, se diversi, uno e' maggiore dell'altro
__________________
In God we trust; all others bring data |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Codice HTML:
int ordinamento(int vett[], int n){
if(n<=1){
return -2;}
if(n==2){
if(vett[0]>vett[1]){return -1;}
if(vett[0]<vett[1]){return 1;}
if(vett[0]==vett[1]){return -2;}}
if(n>2){
ordinamento(int vett[], int n-1);}
per se il vettore ha piu di 2 elementi devo richiamare direttamente la funzione con n-1 o cosa? |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
__________________
Il sole è giallo |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
ma io non devo ordinare il vettore, devo controllare in che modo è ordinato
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Per quanto riguarda la parte n > 2, devi fare qualcosa di piu' articolato: 1 - ret = ordinamento (vett, n-1); // Controlli se il vettore con n-1 elementi e' in qualche modo ordinato 2 - se ((ret == 1 oppure ret == -2) AND // quindi il vettore precedente e' crescente o quasi vett[n-2] <= vett[n-1]) // Anche l'ultimo elemento e' maggiore o uguale del precedente allora puoi ritornare 1, cioe' il vettore al passo n e' ordinato in maniera crescente. Analogamente dovrai affrontare il caso in cui il vettore e' ordinato in maniera decrescente. Piu' semplice e' il caso che il vettore al passo n-1 sia formato da elementi tutti uguali e che anche l'ultimo elemento sia uguale Infine, il caso che il vettore al passo n-1 sia non ordinato e' banale: in tal caso e' non ordinato anche al passo n.
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
piu o meno ho capito, ora faccio un altro esercizio e ci voglio riuscire da solo
grazie |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Una soluzione può essere questa:
Codice:
int ordinato (int *arr, int len)
{
int r = 0;
if (len > 1)
r = arr[0] <= arr[1] ? +1 : -1;
if (len > 2 && ordinato (&arr[1], len-1) != r)
r = 0;
return r;
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
Potete dare un occhiata a questo esercizio. E' una funzione iterativa che somma i numeri presenti in un testo. Mi da dei numeri enormi però il programma sembra giusto
Codice HTML:
#include <stdio.h>
#define SIZE 20
int somma_interi_nel_testo(char *stringa);
int main(){
int somma=0;
char stringa[SIZE];
printf("Inserisci una stringa:\n");
scanf("%s", &stringa);
somma=somma_interi_nel_testo(stringa);
printf("%d", somma);
while(getchar() != '\n');
printf("Premere INVIO per continuare...");
getchar();
}
int somma_interi_nel_testo(char *stringa){
int somma=0;
for(;*stringa='\0';*stringa++){
if(((*stringa)>=0)&&((*stringa)<=9)){
somma += *stringa;}
}}
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Mi sembra che questo codice stabilisca se un vettore e' ordinato semplicemente confrontando i primi 2 elementi dello stesso....
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
Cmq ho provato a passare { 15, 10, 8, 7, 6, 5, 2, 2, 2, 2} e { 15, 10, 8, 7, 3, 3, 3, 3, 2, 1} Mi ha detto, in entrambi i casi, che il vettore non e' ordinato... salvo errori miei, ovviamente (cmq non penso sia un mio errore ma sia l'operatore ternario...)
__________________
In God we trust; all others bring data |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
potete darmi un occhiata all'ultimo programma che ho postato?
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2007
Messaggi: 381
|
questa dovrebbe essere la versione ricorsiva(incompleta), ditemi almeno se sono sulla giusta strada
Codice HTML:
int somma_interi_nel_testo(char stringa[], int n){
if(n==0){
return
if((stringa[n]>=0)&&(stringa[n]<=9)){
return stringa[n]+somma_interi_nel_testo(stringa[n], n-1);} else return somma_interi_nel_testo(stringa[], n-1);}
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Vero ... ma è un problema di concetto a cui non ho pensato subito. Avendo due valori adiacenti uguali, non si può stabilire alcunché sull'ordinamento, nel senso che dovrà essere il resto a determinarlo. In pratica, due valori uguali devono essere "bypassati". Si dovrebbe aggiungere un quarto valore che indica appunto un "non so nulla dell'ordine". Dovrebbe essere ok così: Codice:
int ordinato (int *arr, int len)
{
int r = -2, rr;
if (len > 1)
r = arr[0] < arr[1] ? +1 : arr[0] > arr[1] ? -1 : -2;
if (len > 2)
{
rr = ordinato (&arr[1], len-1);
if (r == -2)
r = rr;
else if (rr != -2 && r != rr)
r = 0;
}
return r;
}
È praticamente la ipotesi dei valori che facevi tu all'inizio.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:25.




















