/********************************
 * Version de base de Fibonacci
 ********************************/

package fr.univ_orleans.bourges.io91.td6;


/**
 * Une implantation de la suite de Fibonacci
 */
public class Fibo
{
    /**
     * Calcule le nème nombre de Fibonacci
     *
     * @param n Un entier positif ou nul.
     * @return Le nème nombre de Fibonacci, sous la forme d'un entier positif.
     * @throws RuntimeException Si n est négatif*/
    public int f(int n)
    {
	if (n<0)   throw new RuntimeException("Erreur lors du calcul de Fibo.f("+n+"): l'argument doit être positif ou nul.");
	if (n==0)  return 1;
	if (n==1)  return 1;
	if (n>=2)  return this.f(n-1) + this.f(n-2);
    }
}



/********************************
 * Avec un compteur.
 ********************************/

package fr.univ_orleans.bourges.io91.td6;


/**
 * Une implantation de la suite de Fibonacci
 */
public class Fibo
{
    /**
     * Le nombre de fois où f a été invoqué.
     */
    private int compteur = 0;

    /**
     * Calcule le nème nombre de Fibonacci
     *
     * @param n Un entier positif ou nul.
     * @return Le nème nombre de Fibonacci, sous la forme d'un entier positif.
     * @throws RuntimeException Si n est négatif ou si le calcul est trop long.*/
    public int f(int n)
    {
	++compteur;
	if(compteur>30)
	    throw new RuntimeException("Calcul trop long");
	if (n<0)   throw new RuntimeException("Erreur lors du calcul de Fibo.f("+n+"): l'argument doit être positif ou nul.");
	if (n==0)  return 1;
	if (n==1)  return 1;
	if (n>=2)  return this.f(n-1) + this.f(n-2);
    }
}



/************************************
 * Avec plusieurs types d'exceptions
 ************************************/

package fr.univ_orleans.bourges.io91.td6;


/**
 * Une exception lancée si l'utilisateur a donné un argument incorrect.
 *
 * Comme cette exception étend RuntimeException, il n'est pas obligatoire de la rattrapper.
 */
public class ArgumentIncorrectException extends RuntimeException
{
}


package fr.univ_orleans.bourges.io91.td6;


/**
 * Une exception lancée si un calcul dure trop longtemps
 *
 * Comme cette exception étend RuntimeException, il n'est pas obligatoire de la rattrapper.
 */
public class CalculTropLongException extends RuntimeException
{
}


package fr.univ_orleans.bourges.io91.td6;

/**
 * Une implantation de la suite de Fibonacci
 */
public class Fibo
{
    /**
     * Le nombre de fois où f a été invoqué.
     */
    private int compteur = 0;

    /**
     * Calcule le nème nombre de Fibonacci
     *
     * @param n Un entier positif ou nul.
     * @return Le nème nombre de Fibonacci, sous la forme d'un entier positif.
     * @throws RuntimeException Si n est négatif ou si le calcul est trop long.*/
    public int f(int n)
    {
	++compteur;
	if(compteur>30)
	    throw new CalculTropLongException();
	if (n<0)   throw new ArgumentIncorrectException();
	if (n==0)  return 1;
	if (n==1)  return 1;
	if (n>=2)  return this.f(n-1) + this.f(n-2);
    }
}


/************************************
 * Avec un chronomètre
 ************************************/

package fr.univ_orleans.bourges.io91.td6;


/**
 * Une exception lancée si l'utilisateur a donné un argument incorrect.
 *
 * Comme cette exception étend RuntimeException, il n'est pas obligatoire de la rattrapper.
 */
public class ArgumentIncorrectException extends RuntimeException
{
}


package fr.univ_orleans.bourges.io91.td6;


/**
 * Une exception lancée si un calcul dure trop longtemps
 *
 * Comme cette exception étend RuntimeException, il n'est pas obligatoire de la rattrapper.
 */
public class CalculTropLongException extends RuntimeException
{
}


package fr.univ_orleans.bourges.io91.td6;

/**
 * Une implantation de la suite de Fibonacci
 */
public class Fibo
{
    /**
     * Le nombre de fois où f a été invoqué.
     */
    private int   compteur = 0;
    
    /**
     * Instant de la création de l'objet.
     *
     * Mesuré en millisecondes depuis le premier janvier 1970 à 0h.
     */
    private final long lancement = System.currentTimeMillis();

    /**
     * Calcule le nème nombre de Fibonacci
     *
     * @param n Un entier positif ou nul.
     * @return Le nème nombre de Fibonacci, sous la forme d'un entier positif.
     * @throws RuntimeException Si n est négatif ou si le calcul est trop long.*/
    public int f(int n)
    {
	if (System.currentTimeMillis() - lancement > 1000) //Si le calcul a duré plus d'une seconde
	    throw new CalculTropLongException();

	if (n<0)   throw new ArgumentIncorrectException();
	if (n==0)  return 1;
	if (n==1)  return 1;
	if (n>=2)  return this.f(n-1) + this.f(n-2);
    }
}