Aufgabensammlung Programmierung/ Zeckendorf-Sequenz/ Lösung (Java)/ Fibonacci.java

Aus Wikibooks
/**
 * 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);
}

}