Punto informatico Network
Login Esegui login | Non sei registrato? Iscriviti ora (è gratuito!)
Username: Password:
  • Annuncio Pubblicitario

[C] Discussione semi-filosofica sulla ricorsione

Il forum per tutti i developer. Leggere attentamente il regolamento di sezione prima di postare.

[C] Discussione semi-filosofica sulla ricorsione

Messaggioda Zane » mer feb 25, 2004 5:39 pm

Proseguiamo la discussione sulla ricorsionne iniziata nel post [C] Rintracciare cifre adiacenti in una lista

<i>Stiamo parlando della validità o meno della ricorsione nel linguaggio ANSI C</i>

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da Xerex</i>
Ti sbagli...per come è strutturato C, così come la maggior parte dei linguaggi imperativi, la ricorsione è un costrutto errato!<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">
Ma nn so te, ma il mio compilatore nn ha problemi di sorta a fare
Codice: Seleziona tutto
int fatt_ric(int num)
{ if(num==0)
   return(1);
  else
   return (num* (fatt_ric(num-1)));
}

Non ho capito tutto il resto del tuo messaggio (perdona l'ignoranza) ma il pezzetto di codice che ti propongo gira a manetta, e questa è ricorsione.
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

[C] Discussione semi-filosofica sulla ricorsione

Messaggioda Zane » mer feb 25, 2004 5:39 pm

Proseguiamo la discussione sulla ricorsionne iniziata nel post [C] Rintracciare cifre adiacenti in una lista

<i>Stiamo parlando della validità o meno della ricorsione nel linguaggio ANSI C</i>

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da Xerex</i>
Ti sbagli...per come è strutturato C, così come la maggior parte dei linguaggi imperativi, la ricorsione è un costrutto errato!<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">
Ma nn so te, ma il mio compilatore nn ha problemi di sorta a fare
Codice: Seleziona tutto
int fatt_ric(int num)
{ if(num==0)
   return(1);
  else
   return (num* (fatt_ric(num-1)));
}

Non ho capito tutto il resto del tuo messaggio (perdona l'ignoranza) ma il pezzetto di codice che ti propongo gira a manetta, e questa è ricorsione.
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Xerex » mer feb 25, 2004 6:23 pm

Allora, chiarisco il mio concetto:
che la ricorsione si possa fare ok, ma il fatto è che, per come è strutturato il linguaggio C è un metodo balordo.
In un linguaggio improntato all'efficienza poi, usare la ricorsione è darsi la zappa sui piedi.
In più, siccome C non è un linguaggio funzionale, usare la ricorsione, a mio parere, sporca il codice.
La mia frase, nel "vero" C non esiste intendeva dire che in un programma scritto secondo degli standard restrittivi, la ricorsione non c'è.

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote">
Prova a pensare ad ogni RdA creato per ogni blocco e alle funzioni che devi passare per parametro alle funzioni chiamanti...dove vanno a finire i Link dinamici e gli statici?
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

In effetti questa frase non è molto comprensibile[angel], l'idea è quella di evitare che i "collegamenti" a: valori di ritorno, parametri, risultati parziali etc etc di tutte le funzioni, rimangano in memoria occupandola e rallentando le prestazioni.
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)


Messaggioda simox83 » mer feb 25, 2004 9:16 pm

ah ok... tutti d'accordo sulla tua ultima ossevazione... pensavo avessi detto che in C non esisteva la ricorsione!!!!

Spesso la ricorsione è un metodo molto elegante x uscire da situazioni delicate, soprattutto con le strutture dati appunto ricorsive (liste,pile,code,alberi), e risulta anche un metodo + semplice!! La ricorsione è presente in tutti i linguaggi anche perché si basa sul principio matematico dell'induzione per cui posta una proposizione valevole per n, e dimostrata per n+1, questa varrà per tutti gli n!!! spero di essere stato chiaro!!!
ciao
Avatar utente
simox83
Neo Iscritto
Neo Iscritto
 
Messaggi: 12
Iscritto il: mar feb 24, 2004 12:41 pm

Messaggioda Xerex » mer feb 25, 2004 9:44 pm

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da simox83</i>
La ricorsione è presente in tutti i linguaggi.......
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

Non proprio in tutti...
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)

Messaggioda Zane » gio feb 26, 2004 12:04 pm

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da Xerex</i>
In un linguaggio improntato all'efficienza poi, usare la ricorsione è darsi la zappa sui piedi.<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">Ok, su questo niente da dire: ma allora diciamo che non è efficiente, non che nn si possa fare!<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote">
In più, siccome C non è un linguaggio funzionale, usare la ricorsione, a mio parere, sporca il codice. <hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">Come sai non sono un purista!<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote">rimangano in memoria occupandola e rallentando le prestazioni.<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">Ok, ora capisco e concordo!

comunque, ho segnalato la discussione ad alcuni veri e propri luminari del campo....aspettiamo il responso di chi ne sa davvero!
Avatar utente
Zane
MLI Hero
MLI Hero
 
Messaggi: 7935
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Leo » gio feb 26, 2004 1:37 pm

Sono pienamente d'accordo con voi che un algoritmo ricorsivo sia meno efficiente di uno iterativo, ma vogliamo mettere l'eleganza della ricorsione con quella dell'iterazione???

Non c'è proprio nessun confronto...

Secondo me bisogna sempre ricordare qual è lo scopo del programma che si sta scrivendo. Se deve essere il più veloce ed efficiente possibile sicuramente non uso la ricorsione, ma se ho a che fare con alberi, liste o simili e non ho particolari esigenze di velocità, io vado diretto sulla ricorsione perché è sicuramente più comoda.
Di seguito vi riporto un link del corso di algoritmi e strutture dati dell'Università di Roma che dimostra come la ricorsione sia meno efficiente.

www.dis.uniroma1.it/~damore/asd/traspar ... rsione.pdf
Avatar utente
Leo
Silver Member
Silver Member
 
Messaggi: 1683
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Xerex » gio feb 26, 2004 6:48 pm

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da Leo</i>
<br />Sono pienamente d'accordo con voi che un algoritmo ricorsivo sia meno efficiente di uno iterativo, ma vogliamo mettere l'eleganza della ricorsione con quella dell'iterazione???

Non c'è proprio nessun confronto...

<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

Eleganza...l'eleganza, a mio parere, deve essere legata, o meglio nasce da due cose:
1) comprensibilità del codice
2) possibilità di manutentarlo

Bene, ti sfido a dirmi che un programma con costrutti ricorsivi è più comprensibile di uno totalmente imperativo!
E poi, per aggiungere funzionalità non strettamente legate alle vecchie, cosa fai quando ti trovi di fronte a un centinaio di funzioni ricorsive?
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)

Messaggioda Leo » gio feb 26, 2004 7:48 pm

Beh, se ben scritto una funzione ricorsiva è più leggibile di una iterativa.
Ad esempio prendendo la funzione fattoriale, con la ricorsione capisci subito come viene calcolata, ovvero n! = n * (n-1)!

Ripeto, secondo me non c'è un vincitore fra ricorsione e iterazione, dipende dai casi.
Avatar utente
Leo
Silver Member
Silver Member
 
Messaggi: 1683
Iscritto il: lun ago 05, 2002 9:36 am
Località: Ferrara

Messaggioda Xerex » gio feb 26, 2004 10:43 pm

<blockquote id="quote"><font size="1" face="Verdana, Arial, Helvetica" id="quote">citazione:<hr height="1" noshade id="quote"><i>Messaggio inserito da Leo</i>
<br />Beh, se ben scritto una funzione ricorsiva è più leggibile di una iterativa.
Ad esempio prendendo la funzione fattoriale, con la ricorsione capisci subito come viene calcolata, ovvero n! = n * (n-1)!
<hr height="1" noshade id="quote"></blockquote id="quote"></font id="quote">

Non sono per nulla convinto...il fattoriale è solo un'esempio.In più, al momento del "lancio" della funzione fatt in modo ricorsivo, non hai modo di "controllarne" l'esecuzione.

per quel che mi riguarda eviterò sempre accuratamente di usare la ricorsione appena mi sarà possibile, in special modo in un linguaggio 'puro' come il C.
Avatar utente
Xerex
Membro Ufficiale (Gold)
Membro Ufficiale (Gold)
 
Messaggi: 5948
Iscritto il: lun ago 05, 2002 9:36 am
Località: Parma(Pr)


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Google [Bot] e 3 ospiti

Powered by phpBB © 2002, 2005, 2007, 2008 phpBB Group
Traduzione Italiana phpBB.it

megalab.it: testata telematica quotidiana registrata al Tribunale di Cosenza n. 22/09 del 13.08.2009, editore Master New Media S.r.l.; © Copyright 2008 Master New Media S.r.l. a socio unico - P.I. 02947530784. GRUPPO EDIZIONI MASTER Spa Tutti i diritti sono riservati. Per la pubblicità: Master Advertising