[C] help ricorsione

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

[C] help ricorsione

Messaggio da gila75 »

Ciao a tutti, sto studiando la ricorsione, un metodo diverso d'approccio a certi problemi. Ma mi riesce difficile capire alcune cose, e il mio manuale è piuttosto sbrigativo nella spiegazione.
Prendiamo l'esempio classico del fattoriale:

Codice: Seleziona tutto

#include <stdio.h>
unsigned int fact (int n)       *1
 {
   if (n<=1)  *2
return 1;
   else {
	return n*fact(n-1);}       *3
  }
int main (void) {
int x=3;
printf " %u\n",fact(x));      *4
return 0;}
scrivo qui il codice per chiarezza e segno con l'asterisco e numero le pari salienti che non capisco.
A parte il fatto che con un ciclo for, si potrebbe risolvere subito, ma da come ho capito la ricorsione a volte è l'unico modo, e in più "fa" ragionare in modo diverso.
Comunque, nel main, passo alla funzione fact il numero 3.
Quando la chiamata viene eseguita (punto *2) la condizione non viene soddisfatta, quindi si salta al punto *3, che a sua volta chiama la funzione fact (punto *1),
che a sua volta non è soddisfatta, finchè n è <=1.
Quando n è <=1 la condizione è soddifatta, e viene ritornato 1.
Ma 1 ritorna al punto *4?
Il mio libro dice:

"...osservate che le chiamate non terminate di fact "s'impilano" fino a quando alla funzione fact non viene passato un 1.
A questo punto le vecchie chiamate a fact iniziano a "srotolarsi" una a una fino a quando la chiamata originale (fact(3)) restituisce il risultato ...."


Non capisco questo!!! Srotolarsi, implica il fatto che le chiamate restino "congelate" e/o "memorizzate" da qualche parte, no? Azzardo: nello stack, nella heap...bo!!!
Come se si nidificassero una dopo l'altra...non riesco proprio a capire.
Ammesso che sia come ho detto sopra, che vantaggi avrei rispetto a un ciclo for??? Molto più veloce e immediato.
Mi confonde parecchio le righe del mio libro che ho scritto sopra.
Se qualcuno mi desse una mano...
Non mi va di non capire la ricorsione, magari non la si usa spesso, ma credo (letture qua e la) che alcuni problemi siano dei rompicapo in modo iterativo, mentre la ricorsione semplifica molto.
Ma ahimè, non è così immediata da capire come invece dicono i testi.
Grazie a tutti in anticipo
Ultima modifica di gila75 il mercoledì 26 giugno 2013, 19:03, modificato 1 volta in totale.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [C] help ricorsione

Messaggio da vaeVictis »

Ti faccio un esempio del perché la ricorsione è differente da un ciclo for: non sempre sai a priori il numero di volte che devi "riapplicare" una funzione; qui lo sai, perché è il fattoriale di un numero e hai il "limite massimo" per il tuo for... ma se per esempio devi traversare una struttura di cui non sai "nulla"?
Metti che vuoi controllare ricorsivamente il contenuto di una directory, tanto per fare un esempio "terrestre".

Per le altre perplessità, aspetto che si esprimano prima altri :)
(... e dopo che si saranno espressi, dubito ci sia bisogno anche delle mie, di espressioni)


p.s.:
usa il tag per il codice
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

Si veaVictis, infatti credo che sia proprio quello il punto di forza, non sapere a priori è una bella rogna con altri metodi.
Anche alcuni algoritmi, stavo studiando, tra cui il quick sort, usano la ricorsione.
Riguardo al tag per il codice, credevo fosse più chiaro metterlo come ho fatto, visto che è pure corto, ma nel caso modifico, che dici?
Intanto grazie.
Sto provando ancora a capire...ma quel fatto delle chiamate che si "srotolano" come dice il libro, mi manda il "palla"...
Se si srlotolano, si devono prima arrotolare, giusto?
E per arrotolarle, devi tener traccia...ma come e dove???
Mi da quasi l'impressione davvero che si nidifichino una dentro l'altra, per poi essere restituite, un po' come le CALL/RETURN assembly (parlo dei pic).
Le potevi nidificare, poi uscivano con una logica non ricordo se fifo o lifo...ma li è un'altra faccenda.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [C] help ricorsione

Messaggio da vaeVictis »

tag codice: eh... che dico... quello che ho detto :)
Usa il tag per il codice, come dice anche il regolamento, che è più chiaro.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

ok, fatto ;)
Frodo478
Prode Principiante
Messaggi: 27
Iscrizione: domenica 6 maggio 2012, 9:02
Desktop: GNOME
Distribuzione: 12.04

Re: [C] help ricorsione

Messaggio da Frodo478 »

Allora da dove partire...
Inanzitutto il tuo ragionamento sull'arrotolamento è sensato, infatti la ricorsione utilizza uno stack per il salvataggio di dati che quando si verifica una condizione di terminazione, "riottiene" uno per uno i dati "impilati" rielaborandoli.
La ricorsione prevede una logica differente rispetto ai normali cicli, soprattutto quando gli algoritmi diventano complessi.
I vantaggi sono la brevità delle funzioni, e spesso la facilità sia nella scrittura (a patto che si conosca bene ciò che si scrive) e sia nella comprensione (leggibilità) del codice.
Gli svantaggi sono la lentezza dell'esecuzione, infatti spesso per gli algoritmi veloci si utilizzano i for, il rischio di overflow con la congestione del sistema.
Quindi la ricorsione è da capire e da usare con parsimonia, facendo soprattutto attenzione all'implementazione corretta degli algoritmi per verificare sempre la condizione di uscita.
Prova, per capire meglio come funziona, a far crashare il sistema (chiudendo le risorse importanti :p ) con degli algoritmi ricorsivi. Cerca di velocizzare sempre di più il crash, così si impara bene :muro:
ciao :ciao:
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

Grazie Frodo478, però cavolo, sia sul mio libro ,che in rete, nessuno fa cenno a questa cosa che le chiamate "sospese" vengono memorizzate nello stack... ecchecavolo... se lo dicessero, uno non impazzisce, no???
Quindi ricapitolando, quando if (n<=1) è soddisfatto, vine ritornato 1 alla chiamata a funzione che c'è nel main ( printf " %u\n",fact(x));) quindi fact riporta il valore 1 alla funzione.
Adesso se ho capito bene, tutte le funzioni sospese ripartono:
fact(2)=2*1;
fact(3)=3*2=6
Quindi se è così, la prima chiamata sospesa è la prima ad uscire, giusto? Logica fifo no?
Grazie ancora, non so se ho capito bene, e comunque ci devo lavorare e fare le prove che mi hai indicato
faveroandrea
Prode Principiante
Messaggi: 17
Iscrizione: lunedì 29 ottobre 2012, 16:38
Desktop: gnome-fallback
Distribuzione: Ubuntu 12.10
Località: Treviso

Re: [C] help ricorsione

Messaggio da faveroandrea »

Ciao gila75, anche se a scuola non ho ancora affrontato le funzioni ricorsive ( i professori hanno deciso di farle studiando il linguaggio Java l' anno prossimo), se non con qualche accenno, proverò a darti risposta per quello che riguarda lo stack.
Quest' ultimo in italiano chiamato anche pila, è un' area della memoria RAM che contiene i record di attivazione (RDA) delle funzioni.
L' RDA per farla breve, è una regione dinamica della memoria, e contiene tutti gli elementi come le variabili locali, i parametri formali(quelli che stanno sulla testata/prototipo), ed il valore di ritorno (se ovviamente esso c' è), di una funzione.
Ogni volta quindi che viene chiamata una funzione nell' area dello stack, viene creato un nuovo RDA riguardante proprio quella funzione..
Lo stack "usa una politica" di tipo LIFO, last in first out, ovvero l' ultimo ad entrare è il primo ad uscire.
Quindi ovviamente, l' ultima funzione chiamata, secondo l' ordine del programma sarà anche la prima ad essere terminata, ed in quel caso lo stack eliminerà l' RDA che contiene le sue informazioni.
Lo stack piano piano quindi si svuoterà sempre di più fino alla fine del programma.
Quando il tuo libro scrive "..osservate che le chiamate non terminate di fact "s'impilano" fino a quando alla funzione fact non viene passato un 1", giustamente sta dicendo che fino a quando la funzione non ritornerà 1, ovvero terminerà, nello stack continueranno a crearsi nuovi RDA, relativi sempre alla stessa funzione che si richiama.
Sero di essermi fatto capire, oltre al non aver commesso errori :)
Comunque come già detto le funzioni ricorsive sono abbastanza importanti, non solo per l' algoritmo del quicksort (il più efficiente al mondo), ma ad esempio quando affronterai le liste (vedrai anche un' altra parte della memoria chiamata heap) potrai usarle per inserire in modo ordinato un elemento all' interno di esse (si può fare anche senza comunque).
Ciao Andrea :D
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

Grazie Andrea :)
Si, avevo intuito giusto allora, come dici tu e Frodo, ma ripeto, un accenno sui libri ci dovrebbe essere altrimenti uno diventa pazzo!
Cerco di approfondire, poi al massimo richiedo.
Avatar utente
Vincenzo1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 450
Iscrizione: lunedì 14 gennaio 2013, 14:21
Desktop: Unity
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Località: Villabate(PA)
Contatti:

Re: [C] help ricorsione

Messaggio da Vincenzo1968 »

Qui: https://secweb.cs.odu.edu/~zeil/cs361/w ... rsion.html

viene spiegato come funziona la ricorsione e come eliminarla attraverso l'uso di uno stack esplicito.

Nel caso più semplice, quello della ricorsione in coda(tail recursion), non è necessario utilizzare uno stack esplicito. La chiamata ricorsiva si può eliminare sostituendola con un loop while. Per esempio, nel caso del tuo esempio sul calcolo del fattoriale, una possibile implementazione nopn ricorsiva potrebbe essere la seguente:

Codice: Seleziona tutto

long fac(int n)
{
	long returnValue = 1;
	while (n > 0)
	{
		returnValue = fac * n;
		n--;
	}
	
	return returnValue;
}
Non è vero che la ricorsione sia poco utilizzata. Per certi algoritmi, anzi, è fondamentale: per esempio, per gli alberi binari. E anche, come hai notato tu stesso, per molti algoritmi di ordinamento(quicksort, mergesort, etc).
Anche se è sempre possibile convertire un algoritmo ricorsivo in uno iterativo, a volte non conviene perché la versiona iterativa risulterebbe più complicata.

Uno dei motivi per cui si potrebbe desiderare di sostituire un algoritmo ricorsivo con uno iterativo è dovuto al fatto che la ricorsione potrebbe esaurire lo stack di sistema. Con l'iterazione gestiamo esplicitamente lo stack e possiamo, dunque, regolarci come meglio crediamo.
Un altro motivo è che spesso(anche se non sempre) le versioni iterative risultano più efficienti(in termini di velocità di esecuzione) rispetto a quelle ricorsive.

Riepilogando:

- Gli algoritmi iterativi sono più eleganti e il codice è più breve(divide et impera ;) ).
- I corrispondenti algoritmi iterativi possono risultare più veloci(non sempre) ma il codice è più lungo, meno elegante e più difficile da comprendere(non sempre, come nel caso della versione iterativa del fattoriale ;) );
È ormai difficile incontrare un cretino che non sia intelligente e un intelligente che non sia un cretino. [...] Oh i bei cretini di una volta! Genuini, integrali. Come il pane di casa. Come l'olio e il vino dei contadini. (da "Nero su nero" di Leonardo Sciascia)
Avatar utente
TuxDroid1
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 586
Iscrizione: mercoledì 24 ottobre 2012, 15:54
Desktop: XDE
Distribuzione: Ubuntu 12.10, Sabayon

Re: [C] help ricorsione

Messaggio da TuxDroid1 »

Ciao! Mi accodo anche io alle risposte :D
nessuno fa cenno a questa cosa che le chiamate "sospese" vengono memorizzate nello stack... ecchecavolo... se lo dicessero, uno non impazzisce, no???
Direi che è normale: come viene implementata la gestione delle chiamate ricorsive in un linguaggio non è materia da manuale del linguaggio (un manuale di Fortran, per dire, non ti spiegherà mai perchè non è possibile definire funzioni ricorsive. Dirà solo che non è possibile farlo..). Quindi a meno che tu non vada a vedere le scelte d'implementazione fatte per un dato linguaggio queste cose "cadono un po dal cielo" .

Per quanto riguarda lo "srotolarsi", se vuoi un consiglio che apparentemente potrebbe sembrarti strano, ma potrebbe essere molto utile (per me lo è stato), leggi come funziona la funzione (scusa il gioco di parole) "fold_r" o "fold_l" nei linguaggi funzionali (ML va benissimo). Ragionandoci un po su riusciresti a collegare quell'implementazione ad alto livello con l'implementazione a basso livello della ricorsione. Hanno molti punti in comune a mio avviso, e potrebbe aiutarti ad "astrarre" il meccanismo che c'è dietro senza scomodare troppo concetti matematici piuttosto ostici, come calcoli del punto fisso e semantiche varie.
Che altro dire... personalmente non amo particolarmente la ricorsione ed evito di utilizzarla accuratamente, per motivi che vanno oltre le finalità di questo post (ci vorrebbe un corso annuale credo! XD ).

Ultime due cose un po OT:
i professori hanno deciso di farle studiando il linguaggio Java l' anno prossimo
Sarebbe interessante sapere il perchè spiegare la ricorsione con Java... credo sia più naturale utilizzarla in altri linguaggi imperativi e funzionali, come ML e C ad esempio! :D
l' algoritmo del quicksort (il più efficiente al mondo)
E' un po azzardato... è il più efficiente quando sono presenti determinate condizioni, in altri casi sono più efficienti altri... Direi che non esiste un algoritmo migliore di un altro (eliminando lo stupid sort che è puramente didattico...), esiste un algoritmo più adatto di un altro a rispondere efficientemente alle nostre esigenze :)
Avatar utente
Vincenzo1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 450
Iscrizione: lunedì 14 gennaio 2013, 14:21
Desktop: Unity
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Località: Villabate(PA)
Contatti:

Re: [C] help ricorsione

Messaggio da Vincenzo1968 »

Un bel libro per comprendere la ricorsione è questo:

http://eu.wiley.com/WileyCDA/WileyTitle ... 16523.html
Immagine

Gli esempi sono in pascal ma non è difficile da comprendere anche per chi programma in C.
Per chi lo preferisce c'è la versione in Java:

http://www.amazon.com/Thinking-Recursiv ... 0471701467
È ormai difficile incontrare un cretino che non sia intelligente e un intelligente che non sia un cretino. [...] Oh i bei cretini di una volta! Genuini, integrali. Come il pane di casa. Come l'olio e il vino dei contadini. (da "Nero su nero" di Leonardo Sciascia)
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

Grazie a tutti ragazzi...a sentire voi sembrerebbe così semplice...mannaggia allo zuccone che sono allora!!!
Dai con impegno e studio...penso di poterla capire a fondo.
é il return 1 che mi confonde ancora un po' : vediamo un attimo.
con return 1 io esco dalla funzione e torno nella zona del main dove c'è la chiamata:

printf " %u\n",fact(x));

ora però x vale 1.
è qui che si srotolano tutte le chiamate sospese n0?
fact(2)=2*1=2
fact(3)=3*2=6;
giusto?
Avatar utente
TuxDroid1
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 586
Iscrizione: mercoledì 24 ottobre 2012, 15:54
Desktop: XDE
Distribuzione: Ubuntu 12.10, Sabayon

Re: [C] help ricorsione

Messaggio da TuxDroid1 »

Guarda l'output prodotto introducendo due stampe:

Codice: Seleziona tutto

#include <stdio.h>
unsigned int fact (int n){
    
   if (n<=1){  //2
    printf("1\n");
    return 1;
   }
   else{
    printf("%d\n", n);
    return n*fact(n-1);
    }       //*3
}
  
int main (void) {
int x=3;
printf (" %u\n",fact(x));      //*4
return 0;
}
L'ultimo valore è quello prodotto quando si esce dalla funzione. Ora ricombina i risultati partendo dal più recente (sul teminale) a quello più vecchio. Hai simulato una pila che si estende verso il basso, dunque la pila della ricorsione :D
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

si, avevo provato anche io a mettere le stampe...ma quello che ancora mi sfugge è dove ricombina le funzioni.
Io credo che la funzione passi 1 attraverso return 1, e quindi usciamo dalla funzione stessa e ci ritroviamo nel main, e li tutto si "srotola".
é il quando tutto si ricompone che mi sfugge in definitiva
Avatar utente
TuxDroid1
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 586
Iscrizione: mercoledì 24 ottobre 2012, 15:54
Desktop: XDE
Distribuzione: Ubuntu 12.10, Sabayon

Re: [C] help ricorsione

Messaggio da TuxDroid1 »

Vedila come un'operazione atomica, quando il controllo torna al main la funzione ha già terminato la computazione e il risultato sta in cima alla pila relativa alla funzione ricorsiva. Il main non sa neppure come è implementata la funzione fact() e non è "compito suo" ricombinare i risultati. Il tutto è gestito dalla funzione ricorsiva :D

Molto grossolanamente puoi vedere la pila dei temporanei che si evolve in questo modo:

Codice: Seleziona tutto

3                            3                                     6 
2                 ====>      2                =====>     
1
In cima avrai solo il risultato da restituire al chiamante quando la funzione termina. Sta qui la ricombinazione! Prendi quanto detto un po con le pinze, non ricordo se ci vuole almeno un'altra pila per fare questa operazione...
faveroandrea
Prode Principiante
Messaggi: 17
Iscrizione: lunedì 29 ottobre 2012, 16:38
Desktop: gnome-fallback
Distribuzione: Ubuntu 12.10
Località: Treviso

Re: [C] help ricorsione

Messaggio da faveroandrea »

gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4413374#p4413374][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Grazie a tutti ragazzi...a sentire voi sembrerebbe così semplice...mannaggia allo zuccone che sono allora!!!
Dai con impegno e studio...penso di poterla capire a fondo.
é il return 1 che mi confonde ancora un po' : vediamo un attimo.
con return 1 io esco dalla funzione e torno nella zona del main dove c'è la chiamata:

printf " %u\n",fact(x));

ora però x vale 1.
è qui che si srotolano tutte le chiamate sospese n0?
fact(2)=2*1=2
fact(3)=3*2=6;
giusto?
Quando l' ultima funzione ricorsiva chiamata ritorna 1, il chiamante precedente riassume il controllo ovvero la precedente funzione ricorsiva. Questa riprende il controllo ed esegue dall' ultima istruzione sospesa, e anche questa ritorna il valore 1. (a quanto ho capito, devo studiarle ancora per bene le funzioni ricorsive).
Sarà così fino a che che non si arriverà al main.
Devi pensare allo stack come una pila che cresce di un unità alla volta (RDA dopo RDA), e che decresce di una unità alla vlta.
C' è da precisare comunque che x non vale 1, ma bensì 3, perchè il parametro è passato per valore alla funzione e non per indirizzo, tramite l' ausilio dei puntatori.
Ecco prova ad eseguire il codice. Ho inserito una stampa che dovrebbe chiarirti le idee sul fatto:
#include <stdio.h>

Codice: Seleziona tutto

#include <stdio.h>
unsigned int fact (int n)      
{
   if (n<=1)  
	return 1;
   else 
   return n*fact(n-1);
}   
int main (void)
{
	int x=3;
	printf(" %u\n",fact(x));   
	printf(" x vale %d", x);   
	return 0;
} 
EDIT:
Cosa significa questo? :o x vale sempre 3, anche se il passaggio dei parametri fosse à la LISP! XD
Mi riferivo a questa frase, ma forse ho compreso male io cosa voleva dire lui XD
printf " %u\n",fact(x));

ora però x vale 1.
Sarebbe interessante sapere il perchè spiegare la ricorsione con Java... credo sia più naturale utilizzarla in altri linguaggi imperativi e funzionali, come ML e C ad esempio! :D
Si in effetti, ma quest' anno abbiamo corso parecchio, e non siamo riusciti ad approfondire per mancanza di tempo questo fatto. Quindi da quanto ho capito lo riprenderemo l' anno prossimo.
E' un po azzardato... è il più efficiente quando sono presenti determinate condizioni, in altri casi sono più efficienti altri... Direi che non esiste un algoritmo migliore di un altro (eliminando lo stupid sort che è puramente didattico...), esiste un algoritmo più adatto di un altro a rispondere efficientemente alle nostre esigenze :)
Si scusa, ho l' ho sparata un po' grossa in effetti in questo punto del discorso.
Ultima modifica di faveroandrea il mercoledì 26 giugno 2013, 22:03, modificato 1 volta in totale.
Avatar utente
TuxDroid1
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 586
Iscrizione: mercoledì 24 ottobre 2012, 15:54
Desktop: XDE
Distribuzione: Ubuntu 12.10, Sabayon

Re: [C] help ricorsione

Messaggio da TuxDroid1 »

C' è da precisare comunque che x non vale 1, ma bensì 3, perchè il parametro è passato per valore alla funzione e non per indirizzo, tramite l' ausilio dei puntatori.
Cosa significa questo? :o x vale sempre 3, anche se il passaggio dei parametri fosse à la LISP! XD


Btw si sta andando su concetti di architettura, se vuoi provo a spiegarteli in maniera semplicistica, ma bisognerebbe conoscere almeno come funziona lo stack del processore e come si evolve in politica LIFO...
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [C] help ricorsione

Messaggio da gila75 »

Il main non sa neppure come è implementata la funzione fact() e non è "compito suo" ricombinare i risultati.
Ma scusa Tux, quando n<=1 incontra return 1, che a sua volta fa ritornare 1 al main, cioè con

if (n<=1)
return 1;
diciamo: se n è uguale o minore 1 ritorna (e quindi esce dalla funzione) 1 al main. Giusto fin qui?
E allora, come dici giustamente tu, come piffero si ricombiano tutte le chiamate?
è quello il mio dilemma!!!
Con return 1, io esco dalla funzione.
ma forse alle 22 e dopo 8 ore di fabbrica ho il cervello che va a 3 come le macchine!!!
Magari domani capisco.
Più che altro mi preme riuscire a farti/vi capire cosa intendo io. Riesco a spiegarmi?
faveroandrea
Prode Principiante
Messaggi: 17
Iscrizione: lunedì 29 ottobre 2012, 16:38
Desktop: gnome-fallback
Distribuzione: Ubuntu 12.10
Località: Treviso

Re: [C] help ricorsione

Messaggio da faveroandrea »

Ho risposto nelle quote editando il messaggio precedente. Spero si capisca :)
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti