|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2003
Città: roma
Messaggi: 1629
|
Funzione ricorsiva in c
Scrivere una funzione in c,sia in versione iterativa che ricorsiva,che conta le occorrenze di un valore intero all'interno di una lista di variabili strutturate di tipo
Codice:
struct item{ int val; struct item *next; } La mia soluzione iterativa è questa: Codice:
int conta_lista(struct item *p,int valore) { int conta=0; /* ciclo di scansione */ while(p != NULL) { if(p->val==valore){conta++;} //verifico se il valore della lista è //è uguale a quello che voglio contare p = p->next; // scorre di un elemento } return conta; } Ultima modifica di mic85rm : 01-07-2011 alle 14:38. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Apr 2007
Messaggi: 182
|
Prova a pensare a queste due cose:
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Per renderla ricorsiva, oltre ai due parametri presenti nella versione iterativa, è neccessario un argomento in più: il contatore delle occorrenze trovate (che nella versione iterativa è una variabile locale)
La funzione 'conta_lista' ricorsiva, compie tre 'passi' nel suo corpo: 1) controlla se siamo arrivati al 'caso base' (cioè se la ricorsione è terminata) ovvero se il puntatore alla struttura vale NULL, nel qual caso ritorna il controllo al chiamante; 2) esegue la sua funzionalità, ovvero controlla se il valore del campo val è uguale a quello cercato e in tal caso incrementa il contatore; 3) infine esegue la chiamata ricorsiva: ovvero incrementa il valore del puntatore alla struct in modo che punti all'elemento successivo e richiama se stessa passando i tre argomenti. Ti è chiaro il ragionamento?
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Un altro modo è, senza il parametro "conta", restituire 1 + la chiamata ricorsiva se l'elemento corrente è quello cercato altrimenti 0 + la chiamata ricorsiva
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2003
Città: roma
Messaggi: 1629
|
ora provo...cmq la funzione iterativa è corretta?
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Dec 2003
Città: roma
Messaggi: 1629
|
Codice:
int conta_lista(struct item *p,int valore) { int conta=0; if (p==NULL){ return conta;} if (p->val==valore){conta++;conta_lista(p->next,valore)} if (p->val!=valore){conta_lista(p->next,valore)} } |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2774
|
Nelle chiamate ricorsive non viene conservato il valore di "conta" se non lo passi come parametro.
La versione iterativa ad occhio sembra corretta |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Si può fare in 2 righe (come già consigliato da wingman87 nel suo primo post)
Codice:
se puntatore == NULL return 0; return (puntatore->val == valore) + chiamata ricorsiva(...) ![]() ![]() edit: comunque cerca di capire come funziona la cosa.. per capire bene usa carta e penna |
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Che cos'è un libro? un insieme ordinato di capitoli. Oppure? un capitolo seguito eventualmente da un altro libro.
Che cos'è un treno? Un insieme ordinato di vagoni. oppure? un vagone eventualmente seguito da un altro treno. Quindi, se un vagone è lungo 1, quanto è lungo un treno? 1 (il primo vagone) + la lunghezza del treno "rimanente".. e quest'altro treno quanto è lungo? 1 + la lunghezza del suo treno "rimanente"... e quando arrivo all'ultimo vagone che non ha più niente attaccato? questo è il cosiddetto "passo base": 1 +0. ciao! british |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:39.