|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
[c++] ricorsiva: operazioni su array(esercizio)
Ho provato a svolgere questo esercizio..c'è qualcuno che mi dice cosa sbaglio?:
Si scriva in c++ una funzione RICORSIVA che, ricevuti come paramentri un array di interi e la sua dimensione, restituisca true se e solo se è verificata la condizione descritta di seguito: l'array (la cui dimensione si suppone essere multiplo di 3) va esaminato per terne di elementi. Ciascuna terna deve avere gli elementi esterni uguali tra loro e maggiori dell'elemento centrale. Inoltre, a sequenza di terne contenuta nell'array deve essere strettamente crescente, nel senso che in ogni terna gli elementi esterni devono essere strettamente minore dell'elemento centrale della terna successiva: esempio:dato l'array: 2 1 2 5 2 5 7 5 7 9 6 9, di dimensione 12, la funzione dovrebbe restituire true. Infatti si può notare come ciascuna delle terne abbia sempre gli elementi esterni uguali fra loro e maggiori di quello centrale (ad esempio nella prima terna gli elementi esterni valgono entrambi 2 e sono maggiori dell'elemento centra che vale 1). Inoltre, la sequenza di terne è crescente: ad esempio, gli elementi esterni della seconda terna valgono 5, strettamente minore di 7 che è il valore degli elementi esterni ella terna successiva; Inoltre l'elemento centrale della seconda terna vale 2, strettamente minore di 5 che è il valore dell'elemento centrale della terna successiva. Specificare quale deve essere la prima invocazione per la funzione. CODICE SVILUPPATO DA ME: Codice:
bool ricorsiva(int array[],int dim, int i){
if(dim%3!=0)
return false;
if(i==(dim+1)) //caso base
return true;
if(a[i-1]!=a[i+1] && a[i+1]<=a[i] && a[i]<=temp_centro && a[i-1]<=temp_sin && a[i+1]<=temp_des)
return false;
return ricorsiva(array, dim, i+3);
temp_centro=a[i];
temp_sin=a[i-1];
temp_des=a[i+1]
}
La prima invocazione deve essere: ricorsiva(array, dim, 1)
|
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
Codice:
if(a[i-1]!=a[i+1] && a[i+1]<=a[i] && a[i]<=temp_centro && a[i-1]<=temp_sin && a[i+1]<=temp_des)
return false;
cioè se una di quelle condizioni è vera devi ritornare falso, no? e poi aggiorni quelle variabili globali dopo la chiamata ricorsiva, non credo abbia molto senso che poi alla prima chiamata chi le inizializza quelle variabili? |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
ops mi sa che è vero....vanno sostituiti con degli OR
per quanto riguarda le variabili temporanee andrebbero messe prima della chiamata ricorsiva? ma così facendo si memorizzano le a[i] correnti..invece a me serve memorizzare quelle della passata precedente |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
Codice:
return ricorsiva(array, dim, i+3); secondo me fai molto prima ad aggiungere tre argomenti alla chiamata ricorsiva, tipo "sin, centro, des", e di volta in volta chiami Codice:
return ricorsiva(array, dim, i+3, i-1, i, i+1); |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
non ho capito come faccio a dire che la variabile sin d esempio deve essere uguale a i-1?cioè come devo scrivere nei parametri della funzione??
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
gli passi a[i-1], oppure l'indice nell'array (cioè i-1).. insomma puoi fare un po' come vuoi
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
e poi come faccio a controllarle nell'if?se metto a[i+1] si riferisce alla posizione corrente ... boh non ho capito...mi faresti vedere un esempio ?
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
2)Cosa intendi per tornare indietro nell'array?! |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
|
Quote:
2) intendo, che ad esempio, se i = 1 fai soltanto il controllo Codice:
if (a[i-1] != a[i+1] || a[i+1] <= a[i])
{
return false;
}
Codice:
int j = i - 3;
if (a[i-1] != a[i+1] || a[i+1] <= a[i] || a[i] <= a[j] || a[i-1] <= a[j-1])
{
return false;
}
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
ho provato a rifarla seconde le indicazioni:
Codice:
bool ricorsiva(int a[],int dim, int i){
int j=i-3;
if(dim%3!=0)
return false;
if(i==(dim-1)) //caso base
return true;
if(i==1){
if(a[i-1] != a[i+1] || a[i+1] <= a[i])
return false;
}else if(i > 1){
if(a[i-1] != a[i+1] || a[i+1] <= a[i] || a[i] <= a[j] || a[i-1] <= a[j-1]) || a[i+1] <= a[j+1])
return false;
}
return ricorsiva(a, dim, i+3);
}
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Non ho capito bene:
Quote:
Quote:
Infatti la terna 5 2 5 ha gli elementi esterni (=5) che NON sono strettamente minori dell'elemento centrale della terna successiva. Infatti la terna successiva e' 7 5 7 e non mi sembra che 5 sia strettamente minore di 5
__________________
In God we trust; all others bring data |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
Quote:
dovrebbe essere cosi, ma controllerò stasera quando torno a casa..: Inoltre, la sequenza di terne contenuta nell'array deve essere strettamente crescente, nel senso che in ogni terna gli elementi esterni devono essere strettamente minore degli elementi esterni della terna successiva |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2011
Messaggi: 1050
|
ho provato a rifarla seconde le indicazioni:
Codice:
bool ricorsiva(int a[],int dim, int i){
int j=i-3;
if(dim%3!=0)
return false;
if(i==(dim-1)) //caso base
return true;
if(i==1){
if(a[i-1] != a[i+1] || a[i+1] <= a[i])
return false;
}else if(i > 1){
if(a[i-1] != a[i+1] || a[i+1] <= a[i] || a[i] <= a[j] || a[i-1] <= a[j-1]) || a[i+1] <= a[j+1])
return false;
}
return ricorsiva(a, dim, i+3);
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:10.




















