[Java] Dimostrazione per induzione?
Salve ragazzi, sto preparando un esame che dovrò sostenere fra pochi giorni e ho preso in mano le tracce degli appelli precedenti per fare un po' di ripasso e ho notato che in ogni esame vi è un esercizio nel quale ci viene chiesto di dimostrare per induzione quello che fa il codice assegnatoci. Vorrei chiedervi: qual'è la tecnica da utilizzare per svolgere questi esercizi?
/** * O per induzione, o riscrivendo il predicato * a[0]+...+a[i-1] == r * dimostrare che il seguente metodo restituisce in r la sommatoria * degli elementi in a. */ public static int somma(int[] a) { int r = 0; int i = 0; while (i < a.length) { r = r + a[i]; i = i + 1; } return r; }
/** * Sia dato un array a con n > 0 elementi. * Per induzione, sul valore di n, dimostrare che * a[0]+...+a[n-1] == somma(a, n). */ public static int somma(int[] a, int n) { if (n > 0) return somma(a, n - 1) + a[n - 1]; else return 0; }
/** * O per induzione, o riscrivendo il predicato * false||a[0]||...||a[i-1] == r * dimostrare che il seguente metodo restituisce in r la disgiunzione * degli elementi in a. */ public static boolean disg(boolean[] a) { boolean r = false; int i = 0; while (i < a.length) { r = r || a[i]; i = i + 1; } return r; }
Risposte
Ciao ragazzi, non ho trovato nessuna dispensa o informazione sul web che mi possa aiutare a capire come impostare il principio di induzione sui medoti. Ho provato a ragionarci un attimo e spero che ci sia qualcuno di voi che sappia dirmi se il mio procedimento è corretto. Prendendo il primo esercizio sulla sommatoria ho provato a ragionare in questo modo:
- Passo base (prima iterazione) $r=0$, $i=0$ allora scrivo: $r = 0 + a[0]$
- Ipotizzo che vale per $r = n$ (un certo numero di iterazioni) e scrivo: $r' = r + a$ e $i' = i + 1$
- Verifico per $n+1$ iterazioni e sostituisco scrivendo $r' = r + a[i']$ quindi $r' = r + a + a[i+1]$ quindi è vera per tutti gli $n+1$
- Passo base (prima iterazione) $r=0$, $i=0$ allora scrivo: $r = 0 + a[0]$
- Ipotizzo che vale per $r = n$ (un certo numero di iterazioni) e scrivo: $r' = r + a$ e $i' = i + 1$
- Verifico per $n+1$ iterazioni e sostituisco scrivendo $r' = r + a[i']$ quindi $r' = r + a + a[i+1]$ quindi è vera per tutti gli $n+1$
/** * O per induzione, o riscrivendo il predicato * a[0]+...+a[i-1] == r * dimostrare che il seguente metodo restituisce in r la sommatoria * degli elementi in a. */ public static int somma(int[] a) { int r = 0; int i = 0; while (i < a.length) { r = r + a[i]; i = i + 1; } return r; }