Summaries
University notes in Markdown format from Obsidian.
Ripasso sulla ricorsione
download Download MDNoi faremo un uso massiccio della ricorsione durante il corso. Quando andiamo a richiamare una funzione, dovreste sapere che in memoria viene generato il record di attivazione della funzione che contiene un elemento per ogni parametro e per ogni elemento locale, oltre a contenere una porzione speciale per la variabile di ritorno.
Una funzione è ricorsiva se richiama se stessa!
Come esempio, vediamo il calcolo del fattoriale di un numero:
int fact(int val) {
if(val <= 1) return 1; // CASO BASE
else // QUI L'ELSE PUO' ESSERE EVITATO
return fact(val-1) * val;
}
Se, per esempio, scriviamo nel nostro main il comando cout<<fact(5);, succederà:
| Chiamate | Return | Valori |
|---|---|---|
| fact(5) | fact(4)*5 | 120 |
| fact(4) | fact(3)*5 | 24 |
| fact(3) | fact(2)*5 | 6 |
| fact(2) | fact(1)*5 | 2 |
| fact(1) | 1 | 1 |
Come altro esempio, possiamo scrivere una funzione che ci permetta di svolgere il calcolo del n-esimo numero della sequenza di Fibonacci:
int fibRec(const int n) {
if((n==0) || (n==1)) return n;
else return fibRec(n-1) + fibRec(n-2);
}
Di seguito si può trovare il valore corrispondente ad ogni chiamata:
| Chiamate | Valori |
|---|---|
| fibRec(0) | 0 |
| fibRec(1) | 1 |
| fibRec(2) | 1 |
| fibRec(3) | 2 |
| fibRec(4) | 3 |
| ... | ... |