[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;
}