Java :: Aufgabe #175 :: Lösung #3

3 Lösungen Lösungen öffentlich
#175

Mononacci, Fibonacci, Multinacci

Anfänger - Java von hollst - 09.07.2017 um 12:16 Uhr
Die Fibonacci-Folge beginnt bekanntlich mit {1, 1}, also zwei Einsen
und jedes Folgeglied ist die Summe seiner zwei Vorgänger. Wir wollen die Fibonacci-Folge wegen der zwei Starteinsen "fibo2" nennen.

Unter einer Multinacci-Folge (fibok) sei eine Folge verstanden, die mit k Einsen beginnt
und jedes Folgeglied die Summe der k Vorgängerglieder ist. Ist k = 1, so heiße der Spezialfall Mononacci.

Die Glieder der Multinacci-Folgen werden ab Glied k immer größer und streben gegen unendlich.
Allerdings strebt der Quotient zweier benachbarter Folgeglieder immer gegen einen endlichen Grenzwert, bei fibo2
ist es bekanntlch der goldene Schnitt phi (phi = 1.618034).

Wir wollen den entsprechenden Grenzwert der Multinacci-Folgen mit "phi_fibok" benennen.

Schreibe ein Programm, das für k = 1, 2, 3 ... 100 die ersten 10 Glieder der Multinacci-Folgen ab Glied k und den Grenzwert phi_fibok ausgibt.

Hinweis: Beider der Grenzwertbildung könnt ihr es mit sehr große Zahlen zu tun bekommen, deshalb Ergebnis auf Plausibilität testen!
#3
vote_ok
von JenZor (40 Punkte) - 21.12.2017 um 14:57 Uhr
Quellcode ausblenden Java-Code
import java.util.ArrayList;

public class Main {
	
	public static void main(String[] args) {
		Multinacci m;
		
		for (int i = 1; i <= 100; i++ ) {
			m = new Multinacci(i);

			m.calculateNextNElements(10);
			
			m.printFirstNElements(10);
			
			System.out.println(m.getPhi());
			
			System.out.println();
		}	
	}
}

public class Multinacci {
	
	private final int k;
	private float phi;
	
	private int calculatedElements;
	private ArrayList<Integer> multinacciList;
	

	public Multinacci(int k) {
		this.k = k;
		
		calculatedElements = 0;
		
		phi = 0.0f;
		
		multinacciList = new ArrayList<Integer>();

		for(int i = 0; i < k; i++) {
			multinacciList.add(1);
		}
		
	}

	public int getK() {
		return this.k;
	}
	
	public float getPhi() {
		return this.phi;
	}
	
	public void calculateNextNElements(int n) {

		for(int j = 0; j < n; j++) {
			
			
			int newElement = 0;
			
			for(int i = 0; i < this.k; i++ ) {
				newElement = newElement + multinacciList.get(multinacciList.size() - 1 - i);
			}
			
			this.multinacciList.add(newElement);
			this.calculatedElements++;
			this.refreshPhi();
		}
	}
	
	public ArrayList<Integer> getFirstNElementsList(int n) {
		if(n < calculatedElements) {
			calculateNextNElements(n - calculatedElements);
		}
			
		ArrayList<Integer> firstNElementsList = new ArrayList<Integer>();
		
		for(int i = 0; i < n; i++) {
			firstNElementsList.add(this.multinacciList.get(k + i));
		}
		
		return firstNElementsList;
	}
	
	private void refreshPhi() {

		this.phi = (float) multinacciList.get(multinacciList.size() -1 ) / (float) multinacciList.get(multinacciList.size() - 2);
	}
	
	public void printMultinacciList() {	
		
		System.out.println(multinacciList);
	}
	
	public void printFirstNElements(int n) {
		System.out.println(getFirstNElementsList(n));
	}
	
}

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben