• Non ci sono risultati.

public static int fattR (int n

N/A
N/A
Protected

Academic year: 2021

Condividi "public static int fattR (int n"

Copied!
3
0
0

Testo completo

(1)

Metodi ricorsivi

1. Scrivere un metodo ricorsivo che calcola il fattoriale di un numero naturale n. Si ricorda la definizione del fattoriale: 0! = 1 ed n! = n × (n−1)! per n ≥ 1. Se al metodo viene passato un numero intero negativo, il metodo restituisce -1.

public static int fattR (int n) { if (n < 0) return -1;

if (n == 0) return 1; // caso base

return n*fattR(n-1); // clausola ricorsiva }

Questo metodo, che corrisponde all’usuale definizione matematica ricorsiva del fat- toriale, `e detto metodo con ricorsione annidata (nested recursion). Un metodo con ricorsione in testa (tail-recursive) per il fattoriale `e il seguente:1

public static int fattTR (int n) { if (n < 0) return -1;

return fattTR(n,1);

}

public static int fattTR (int n, int r) {

if (n == 0) return r; // caso base

return fattTR(n-1,n*r); // clausola ricorsiva }

2. Scrivere un metodo ricorsivo che calcola l’n-esimo numero di Fibonacci. Si ricorda la definizione dei numeri di Fibonacci: f ib(0) = 1, f ib(1) = 1, f ib(n) = f ib(n−1) + f ib(n−2) per n ≥ 2. Se al metodo viene passato un numero intero negativo, il metodo restituisce -1.

public static int fibR (int n) { if (n < 0) return -1;

if (n <= 1) return 1; // casi base

return fibR(n-1) + fibR(n-2); // clausola ricorsiva }

3. Scrivere un metodo ricorsivo che, dati un array di interi a ed un intero n, restituisce true se n compare in a, false altrimenti.

public static boolean occorreRic (int[] a, int n) { return occorreRic(a,n,0);

}

public static boolean occorreRic (int[] a, int n, int i) { if (i == a.length)

return false;

if (a[i] == n) return true;

return occorreRic(a,n,i+1);

}

1Notare come il metodo venga sovraccaricato (overloaded) e come sia necessario introdurre ulteriori parametri nel metodo ricorsivo.

1

(2)

4. Scrivere un metodo ricorsivo che, dati un array di interi a ed un intero n, restituisce il numero delle occorrenze di n in a.

Soluzione con ricorsione annidata

public static int occorrenzeRic (int[] a, int n) { return occorrenzeRic(a,n,0);

}

public static int occorrenzeRic (int[] a, int n, int i) { if (i == a.length)

return 0;

if (a[i] == n)

return 1 + occorrenzeRic(a,n,i+1);

return occorrenzeRic(a,n,i+1);

}

Soluzione con ricorsione in testa

public static int occorrenzeRic (int[] a, int n) { return occorrenzeRic(a,n,0,0);

}

public static int occorrenzeRic (int[] a, int n, int i, int c) { if (i == a.length)

return c;

if (a[i] == n)

return occorrenzeRic(a,n,i+1,c+1);

return occorrenzeRic(a,n,i+1,c);

}

5. Scrivere un metodo ricorsivo che, dati un array di interi a ed un intero n, restituisce la posizione della prima occorrenza di n in a, e -1 se n non compare in a.

public static int posizioneRic (int[] a, int n) { return posizioneRic(a,n,0);

}

public static int posizioneRic (int[] a, int n, int i) { if (i == a.length)

return -1;

if (a[i] == n) return i;

return posizioneRic(a,n,i+1);

}

6. Scrivere un metodo ricorsivo che, dati un array bidimensionale di interi a ed un intero n, restituisce true se n compare in a, false altrimenti.

public static boolean occorreRic (int[][] a, int n) { return occorreRic(a,n,0,0);

}

2

(3)

public static boolean occorreRic (int[][] a, int n, int i, int j) { if (i == a.length)

return false;

if (j == a[i].length)

return occorreRic(a,n,i+1,0);

if (a[i][j] == n) return true;

return occorreRic(a,n,i,j+1);

}

7. Scrivere un metodo ricorsivo che, dati un array bidimensionale di interi a ed un intero n, restituisce il numero delle occorrenze di n in a.

public static int occorrenzeRic (int[][] a, int n) { return occorrenzeRic(a,n,0,0,0);

}

public static int occorrenzeRic (int[][] a, int n, int i, int j, int c) { if (i == a.length)

return c;

if (j == a[i].length)

return occorrenzeRic(a,n,i+1,0,c);

if (a[i][j] == n)

return occorrenzeRic(a,n,i,j+1,c+1);

return occorrenzeRic(a,n,i,j+1,c);

}

3

Riferimenti

Documenti correlati

Esercizio 4 Scrivere un metodo di classe ricorsivo che riceve in ingresso una stringa ed un carattere e restituisce true se il carattere compare nella stringa e false altrimenti (una

//Somma ricorsivamente i valori contenuti nell'array A di dimensione n public static int sommaArray(int[] A, int n){...};. //Trova ricorsivamente il massimo contenuto in un array

public void replaceElement(Position p, Object element) throws InvalidPositionException;. public void swapElements(Position a, Position b) throws

La presentazione della tesi di un laureando davanti ad una commissione di laurea pu`o essere descritta tramite il nome e la matricola del laureando, il titolo della tesi, il nome

La sessione di una conferenza pu`o essere caratterizzata dal nome della con- ferenza, dal numero di sessione, dal nome del coordinatore della sessione e dall’elenco delle

Scrivere un metodo ricorsivo che, dato un array a di stringhe, restituisce true se a `e ordinato in modo crescente rispetto alla lunghezza dei suoi elementi, e false

Scrivere un metodo in linguaggio Java che, dato un array di interi a, resti- tuisca true se i suoi elementi sono in ordine non decrescente (a[0]≤ a[1] ≤.. Si consideri la

- un metodo che restituisce una stringa che descrive un volo non diretto tramite sigla del volo, citt`a e nome dell’aereoporto di partenza, citt`a e nome dell’aereoporto di