/** * RecursiveMeanComputer * * Classe eseguibile che calcola il valore medio degli elementi di un array di * interi in modo ricorsivo. L'array sia riempito solo in parte. * * @author Adriano Luchetta * @version 5-nov-2005 * * Espressione ricorsiva della media (S e' il simbolo di sommatoria): * N-1 * media(a, N) = _1_ * S a[i] = _1_ * (a[N-1] + (N-1] * media(a, N-1)) * N i=0 N */ import java.util.Random; public class RecursiveMeanComputer { /** calcola ricorsivamente la media degli elementi di un array di numeri interi riempito solo in parte. @param a l'array in cui calcolare la media @param aSize il numero di elementi nell'array @return la media @throws java.lang.IllegalArgumentException se l'array non ha almeno un elemento */ public static double recursivelyComputeMean(int[] a, int aSize) { // gestione precondizioni if (a == null || a.length < 1) throw new IllegalArgumentException("array nullo o vuoto: valori non ammessi"); if (aSize < 1) throw new IllegalArgumentException("aSize = " + aSize + " valore non ammesso"); // caso base if (aSize <= 1) return (double) a[0]; // passo ricorsivo return (a[aSize - 1] + (aSize - 1) * recursivelyComputeMean(a, aSize - 1)) / aSize; } /* calcola la media iterativamente */ private static double iterativelyComputeMean(int[] a, int aSize) { int sum = 0; for (int i = 0; i < aSize; i++) sum = sum + a[i]; return (double)sum / aSize; } /* rende la classe eseguibile */ public static void main(String[] args) { if (args.length < 2) { System.out.println("uso: $java RecursiveMeanComputer dim max"); return; } final int DIM= Integer.parseInt(args[0]); final int MAX = Integer.parseInt(args[1]); int sum = 0; int[] a = new int[DIM]; System.out.print("a = "); Random rand = new Random(); for (int i = 0; i < DIM; i++) { a[i] = 1 + rand.nextInt(MAX); System.out.print(a[i] + " "); sum = sum + a[i]; } System.out.println(); System.out.println("media ricorsiva = " + recursivelyComputeMean(a, a.length)); System.out.println("media iterativa = " + iterativelyComputeMean(a, a.length)); } }