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

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!
#1
vote_ok
von KarinB (300 Punkte) - 13.07.2017 um 23:37 Uhr
Quellcode ausblenden Java-Code
import java.util.*;

public class MultinaccioMitGrenzwert {

    public static void main(String[] args) {
	List<Integer> mult = new ArrayList<Integer>();
	System.out.println("1 1 1 1 1 1 1 1 1 1 ");
	System.out.println("phi_fib1: 1");

	// for zum Zeilendurchlauf und Ausgeben
	for (int i = 2; i <= 100; i++) {
	    int k0 = i;
	    int k1 = 2 * i - 1;
	    mult.add(new Integer(k0));
	    mult.add(new Integer(k1));
	    int nr = 2;
	    boolean gw = false;
	    double phi = (double) k1 / (double) k0;

	    // while zum Aufbau der Array-Listen
	    while ((mult.size() < 10) || ((mult.size() > 10) && !gw)) {
		int next = 0;

		// Zahlen aufbauen
		if (i <= nr)
		    for (int j = 0; j < i; j++)
			next += mult.get(nr - j - 1);
		else {
		    for (int j = 0; j < nr; j++)
			next += mult.get(nr - j - 1);
		    next += (i - nr);
		}

		mult.add(new Integer(next));

		// Grenzwertberechung, Epsilon = 0.0001
		if (!gw) {
		    if (((double) next / (double) mult.get(nr - 1)
			    - (double) mult.get(nr - 1) / (double) mult.get(nr - 2)) < 0.0001) {
			gw = true;
			phi = (double) next / (double) mult.get(nr - 1);
		    }
		}
		nr++;
	    }

	    // ausgeben
	    for (int j = 0; j < 10; j++) {
		int zahl = mult.get(j);
		System.out.print(zahl + " ");
	    }

	    System.out.println();
	    System.out.println("phi_fib" + i + ": " + phi);
	    System.out.println();
	    mult.clear();
	}

    }
}

Kommentare:

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

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