|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Guarda che l'avevi già scritto prima il codice corretto per questa parte.
|
|
|
|
|
|
#22 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
cionci sai che è stato illuminante il tuo primo post (e anche il ragionamento a "pezzi" che hai fatto successivamente)? Sinceramente la spiegazione mi è sembrata un pochettino confusionaria, ma sicuramente è più chiara di un codice che ho trovato che mi ha fatto mettere le mani nei capelli.
Credevo di averla capita la ricorsione, ma quando ho visto questo codice dopo 4 righe mi sono bloccato, una cosa orrenda. Cosi mi chiedo se l'abbia capita davvero o no la ricorsione. Se lo ritrovo posto il codice (è in Python).
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
#23 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Un esercizio secondo che mette molto meglio in evidenza quello che voglio dire è ad esempio la ricerca dell'ultimo elemento del vettore che è mutiplo di un valore (supponiamo che sia obbligatorio partire a controllare dall'elemento zero e non sia possibile partire dall'ultimo, la cosa sarebbe obbligatoria in una lista singolarmente linkata). |
|
|
|
|
|
|
#24 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 4683
|
Quote:
__________________
Firma eliminata e avatar cambiato. Troppa gente giudica il monaco dall'abito. |
|
|
|
|
|
|
#25 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
così potrebbe andare? purtroppo non mi da il risultato che volevo
Codice:
int ricerca(int a[], int dim, int n, int pos){
if(pos>dim){
return -1;
}
else{
if(a[pos]%n==0) return pos;
else return ricerca(array,SIZE,n,pos++);
}
}
|
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Cory: perché ogni volta torni indietro ?
Parti da qui: Codice:
if(a[i]%n==0) return i; if(i==dim-1) return -1; Nota: che quella sopra può anche andare bene, cambiando qualche nome alle variabili, ma ti sei nuovamente perso fra if ed else. Sia chiaro che catene di if else possono andare, questa volta il codice è facile, ma non ti permettono di SEPARARE le varie parie parti. Ultima modifica di cionci : 11-06-2009 alle 16:10. |
|
|
|
|
|
#27 |
|
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
scusa, ma tu come lo faresti?? perchè più che quello che ho scritto sopra non saprei che diavolo fare..
|
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Il tuo codice in fondo va anche bene è la forma in cui l'ha scritto che per una situazione più complessa ti crea sicuramente problemi.
Codice:
int ricerca(int a[], int dim, int n, int pos = 0)
{
//prima condizione di arresto
if(pos>=dim)
{
return -1;
}
//seconda condizione di arresto
if(a[pos]%n==0)
{
return pos;
}
//gestione del passo di ricorsione generico
return ricerca(a, dim, n, pos+1);
}
- if condizione di arresto con il return immediato - gestione del passo di ricorsione generico si ottiene la divisione di cui ti parlavo all'inizio e non ti incasinerai mai più con gli if else delle condizioni di arresto. Anche se questo caso è semplice, per generalizzare, per la gestione del passo di ricorsione generico tu sai che puoi avere in mano: - valore dei parametri attuali della funzione - valori ritornati delle ricorsioni Ad esempio: trovare l'ultimo elemento del vettore dispari (nota: bisogna obbligatoriamente eseguire la ricorsione dal primo elemento): (0) Condizione di arresto: sono arrivato in fondo al vettore (N) Condizione di ricorsione generica: (N.1) - valore ritornato dalla ricorsione: posso avere in mano l'indice dell'elemento successivo al corrente che è dispari (N.2) - parametri attuali della funzione: posso conoscere se l'elemento attuale è dispari Il codice viene da solo: Codice:
int ricerca(int *a, int dim, int i = 0)
{
//(0)
if(i >= dim)
return -1;
//(N)
int res1 = ricerca(a, dim, i + 1); //(N.1)
int res2 = -1;
if(a[i] % 2) //(N.2)
res2 = i;
//se un elemento successivo è dispari il valore è diverso da -1
if(res1 > 0)
return res1;
//altrimenti ritorno res2;
return res2;
}
Codice:
int ricerca(int *a, int dim, int i = 0)
{
if(i >= dim)
return -1;
int res1 = ricerca(a, dim, i + 1); //(N.1)
if(res1 > 0)
return res1;
if(a[i] % 2)
return i;
return -1;
}
Codice:
int ricerca(int *a, int dim, int i = 0)
{
if(i >= dim)
return -1;
int res1 = ricerca(a, dim, i + 1);
return (res1 > 0 || ! a[i] % i) ? res1 : i;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:22.




















