Soluzione 6.3

Ecco una possibile soluzione. Provate a calcolare Fib(40). Non provate a calcolare Fib(50), a meno che non abbiate tempo da perdere...
import java.util.Scanner;

public class FibonacciTester
{  
    public static void main(String[] args)
    {
        int n = 0;

        if (args.length > 1)
        {  System.out.println("Troppi argomenti sulla riga comandi");
            System.exit(1);
        }
        else if (args.length == 1) //n letto dalla riga di comando
        {
            try
            {   n = Integer.parseInt(args[0]); }
            catch (NumberFormatException e)
            {   System.out.println("Parametro errato sulla riga comandi");
                System.exit(1); }
        }
        else //n inserito da standard input (nel caso in cui args.length == 0)
        {  
            Scanner in = new Scanner(System.in);
            while(n <= 0)
            {  
                System.out.println("Introduci un numero intero positivo");
                try
                {  
                    n = Integer.parseInt(in.nextLine());
                }
                catch (NumberFormatException e)
                {  System.out.println("Allora non hai capito...");
                }
            }
        }

        //calcolo iterativo di fib(n) e rilevazione delle prestazioni 
        long time = System.currentTimeMillis();
        long f = iterativeFib(n);
        time = System.currentTimeMillis() - time;
        System.out.println("Soluzione iterativa: Fib(" + n + ") = " + f);
        System.out.printf("Tempo di calcolo: %.3f secondi%n", time/1000.0);

        //calcolo ricorsivo di fib(n) e rilevazione delle prestazioni
        time = System.currentTimeMillis();
        f = recursiveFib(n);
        time = System.currentTimeMillis() - time;
        System.out.println("Soluzione ricorsiva: Fib(" + n + ") = " + f);
        System.out.printf("Tempo di calcolo: %.3f secondi%n", time/1000.0);
    }

    // ---------------------- metodi statici ausiliari ---------------------
    public static long recursiveFib(long n)
    {
        if (n < 1)
            throw new IllegalArgumentException();
        if (n < 3)
            return 1;
        return recursiveFib(n-2) + recursiveFib(n-1);
    }

    public static long iterativeFib(long n)
    {
        if (n < 1)
            throw new IllegalArgumentException();
        long f = 1;
        if (n >= 3)
        {
            long fib1 = 1;
            long fib2 = 1;
            for (int i = 3; i <= n; i++)
            {
                f = fib1 + fib2;
                fib2 = fib1;
                fib1 = f;
            }
        }
        return f;
    }
}