/**
* Klasse zur Repräsentation der Fibonacci-Folge. Diese Klasse kann außerdem
* automatisch die Werte cachen. Als Repräsentation wird eine beliebig lange
* Ganzzahl verwendet.
*/
import java.math.BigInteger;
import java.util.Vector;
public class Fibonacci {
final static int DEFAULT_INCREMENT = 10;
//Interne Speicherstruktur
protected Vector<BigInteger> fibs = new Vector<BigInteger>(2,DEFAULT_INCREMENT);
/**
* Der Konstruktor erstellt eine normale Fibonacci-Folge.
*/
public Fibonacci() {
//Startwerte der Folge
fibs.add(BigInteger.ZERO);
fibs.add(BigInteger.ONE);
}
/**
* Wie oben, nur mit variablen Startwerten
* @args first Erster Eintrag
* @args second Zweiter Eintrag
*/
public Fibonacci(BigInteger first, BigInteger second) {
fibs.add(first);
fibs.add(second);
}
/**
* Diese Funktion generiert Fibonacci-Zahlen bis zur übergebenen Zahl.
* @param limit Grenze, bis zu der Fibonaccizahlen generiert werden sollen.
*/
public void genFibs(int limit) {
int size = fibs.size();
//Wir brauchen die Anzahl der Elemente als Limit, nicht die Fibonaccizahl
if (size >= ++limit) return;
BigInteger lastFib = fibs.get(size - 1);
BigInteger lastLastFib = fibs.get(size - 2);
BigInteger currentFib = null;
do {
currentFib = lastFib.add(lastLastFib);
lastLastFib = lastFib;
lastFib = currentFib;
fibs.add(currentFib);
size++;
} while (size < limit);
}
/**
* Liefert die Fibonacci-Zahl mit dem spezifizierten index zurück.
*/
public BigInteger getFib(int index) {
genFibs(index); //sicherstellen, dass wir genügend haben
return fibs.get(index);
}
/**
* Kürzt die Anzahl der Fibonaccizahlen auf length.
*/
public void cut(int length) {
fibs.setSize(length);
}
}