Esercizio di laboratorio
Argomento: ricorsione semplice, argomenti sulla riga dei comandi.
Scrivere una classe eseguibile RecNumberPrinter, che effettui la stampa dei primi n numeri interi secondo un algoritmo ricorsivo.
- Il massimo numero intero (positivo) da stampare viene passato come argomento nella riga di comando.
- Il risultato della stampa viene visualizzato a standard output.
Suggerimento
Scrivere un metodo statico ricorsivo listNumbers(int n) che realizza l'algoritmo ricorsivo restituendo una stringa contenente i numeri da 1 a n, in ordine crescente, separati da uno spazio. Poi scrivere un metodo main che realizza il comportamento sopra specificato invocando il metodo listNumbers. Il metodo main non deve eseguire alcuna azione se non riceve parametri.
Esempio: l'invocazione listNumbers(5) restituisce la stringa "1 2 3 4 5".
Soluzione
La soluzione ricorsiva al problema è la seguente:
- Se l'input è n = 1, allora la stringa da stampare è la stringa "1" (caso base).
- Altrimenti (n>1) la stringa da stampare è ottenuta:
- Stampando la stringa corrispondente all'input n-1 (passo ricorsivo).
- Concatenando la stringa ottenuta con il numero n (preceduto da uno spazio).
public class RecNumberPrinter{
public static void main(String[] args){
if (args.length != 1)
System.out.println("uso: $java RecNumberPrinter <n>");
else
System.out.println(listNumbers(Integer.parseInt(args[0])));
}
public static String listNumbers(int n){
if (n <= 0) // senza questo controllo si rischia ricorsione infinita
throw new IllegalArgumentException();
if (n == 1) // caso base
return "" + n;
return listNumbers(n-1) + " " + n; // passo ricorsivo
}
}