Pagina 1 di 1

[C] Discussione semi-filosofica sulla ricorsione

MessaggioInviato: mer feb 25, 2004 5:39 pm
da Zane
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.

[C] Discussione semi-filosofica sulla ricorsione

MessaggioInviato: mer feb 25, 2004 5:39 pm
da Zane
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.

MessaggioInviato: mer feb 25, 2004 6:23 pm
da Xerex
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.

MessaggioInviato: mer feb 25, 2004 9:16 pm
da simox83
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

MessaggioInviato: mer feb 25, 2004 9:44 pm
da Xerex
<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...

MessaggioInviato: gio feb 26, 2004 12:04 pm
da Zane
<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!

MessaggioInviato: gio feb 26, 2004 1:37 pm
da Leo
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

MessaggioInviato: gio feb 26, 2004 6:48 pm
da Xerex
<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?

MessaggioInviato: gio feb 26, 2004 7:48 pm
da Leo
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.

MessaggioInviato: gio feb 26, 2004 10:43 pm
da Xerex
<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.