dfada9d036924d650fa3bfb4d2b00dfd6450b937
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-08-26.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-14-25.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_14-56-59.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-02-00.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-10-03.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-23-46.png differ |
linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11.png
| ... | ... | Binary files /dev/null and b/linguaggi/s02/assets/imgs/sottoprogrammi_ed_eccezioni_2026-03-10_15-31-11.png differ |
linguaggi/s02/controllo.md
| ... | ... | @@ -0,0 +1,123 @@ |
| 1 | +# Controllo |
|
| 2 | + |
|
| 3 | +# Controllo |
|
| 4 | + |
|
| 5 | +## Ricorsione |
|
| 6 | + |
|
| 7 | +Metodo alternativo all'iterazione. |
|
| 8 | +Una funz (procedura) e' ricorsiva se e'definita in termini di se stessa. |
|
| 9 | + |
|
| 10 | +```c |
|
| 11 | +int fatt (int n){ |
|
| 12 | + if (n<=1) |
|
| 13 | + return 1; |
|
| 14 | + else |
|
| 15 | + return n* fatt(n-1); |
|
| 16 | +} |
|
| 17 | +``` |
|
| 18 | + |
|
| 19 | +la definizione di una funzione ricorsiva e' analoga alla definizione induttiva di una funzione: |
|
| 20 | + |
|
| 21 | +- il valore F su un argomento e'definito in termini dei valori di F su argomenti piccoli. |
|
| 22 | + |
|
| 23 | +Nei programmi sono possibili definizioni non "corrette": |
|
| 24 | + |
|
| 25 | +```c |
|
| 26 | +int fie1(int n){ |
|
| 27 | + if (n==1) return fie1(1); |
|
| 28 | +} |
|
| 29 | +``` |
|
| 30 | + |
|
| 31 | +ovvero `fie(1) = fie(1)` |
|
| 32 | + |
|
| 33 | +Nota: la ric e' possibile in qualisiasi ling che permetta: |
|
| 34 | + |
|
| 35 | +- funz (o procedure) che possono chiamare se stesse |
|
| 36 | +- gestione dinamica della mem (pila) |
|
| 37 | + |
|
| 38 | +### Ricorsione in coda |
|
| 39 | + |
|
| 40 | +Una chiamata di `g` in `f` si dice _chiamata in coda_ (o tail call) se `f` restituisce il val restituito da g senza ulteriore computazione. |
|
| 41 | +Quindi `f` e'tail recursive se contiene solo chiamate in coda: |
|
| 42 | + |
|
| 43 | +``` |
|
| 44 | +function tail_rec (n: integer): integer |
|
| 45 | +begin … ; x:= tail_rec(n-1) end |
|
| 46 | +``` |
|
| 47 | + |
|
| 48 | +Non ric in coda: |
|
| 49 | + |
|
| 50 | +``` |
|
| 51 | +function non_tail_rec (n: integer): integer |
|
| 52 | +begin … ; x:= non_tail_rec(n-1); y:= g(x) end |
|
| 53 | +``` |
|
| 54 | + |
|
| 55 | +> Nota: |
|
| 56 | +> |
|
| 57 | +> 1. **non server allocazione dinamica della mem con pila**: basta un unico RdA |
|
| 58 | +> 2. Piu' efficiente |
|
| 59 | +> 3. Possibile la generazione di codice tail-recursive usando continuation passing style |
|
| 60 | + |
|
| 61 | +##### Es. Caso del fattoriale |
|
| 62 | + |
|
| 63 | +Converto la seguente funz ric in funz ric in coda: |
|
| 64 | + |
|
| 65 | +```c |
|
| 66 | +int fatt(int n){ |
|
| 67 | + if (n<=1) return 1; |
|
| 68 | + else return n* fattrc(n-1,n*res); |
|
| 69 | +} |
|
| 70 | +``` |
|
| 71 | + |
|
| 72 | +Sol: |
|
| 73 | + |
|
| 74 | +```c |
|
| 75 | +int fattrc(int n, int res){ |
|
| 76 | + if (n<=1) return res; |
|
| 77 | + else return fattrc(n-1,n*res); |
|
| 78 | +} |
|
| 79 | +``` |
|
| 80 | + |
|
| 81 | +##### Altro es: |
|
| 82 | + |
|
| 83 | +Numeri di fibonacci |
|
| 84 | +Definzione induttiva: |
|
| 85 | + |
|
| 86 | +- fib(0) = 0 |
|
| 87 | +- fib(1) = 1 |
|
| 88 | +- fib(n) = fib(n-1) + fib(n-2) |
|
| 89 | + |
|
| 90 | +Versione con ric non in coda |
|
| 91 | + |
|
| 92 | +```c |
|
| 93 | +int fib(int n){ |
|
| 94 | + if (n==0) |
|
| 95 | + return 1; |
|
| 96 | + else |
|
| 97 | + if(n==1) |
|
| 98 | + return 1; |
|
| 99 | + else |
|
| 100 | + return fib(n-1) + fib(n-2); |
|
| 101 | +} |
|
| 102 | +``` |
|
| 103 | + |
|
| 104 | +Complessita' lineare in tempo e spazio (O(n)) |
|
| 105 | + |
|
| 106 | +Versione ric in coda: |
|
| 107 | + |
|
| 108 | +```c |
|
| 109 | +int fibrc(int n, int res1, int res2){ |
|
| 110 | + if (n==0) |
|
| 111 | + return res2; |
|
| 112 | + else |
|
| 113 | + if(n==1) |
|
| 114 | + return res2; |
|
| 115 | + else |
|
| 116 | + return fibrc(n-1,res2,res1+res2); |
|
| 117 | +} |
|
| 118 | +``` |
|
| 119 | + |
|
| 120 | +Complessita': |
|
| 121 | + |
|
| 122 | +- in tempo lineare in n |
|
| 123 | +- in spazio costante (un solo RdA) |