package de.uni_passau.fim.prog1.tutorium.aufgabe09;

/**
 * Leonardo Fibonacci hat im Jahr 1202 die Fibonacci-Folge entwickelt, um das Wachstum
 * einer Kaninchenpopulation zu beschreiben. Die Folge sieht wie folgt aus:
 * 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, . . .
 * Dabei ist jede Zahl die Summe der beiden vorangehenden Zahlen. Die formale Definition
 * lautet:
 * <code>
 * fib(0) = 1
 * fib(1) = 1
 * fib(n) = fib(n−1) + fib(n−2)
 * </code>
 * <p>
 * (a) Schreibe ein Programm, welches die Fibonacci-Folge bis zu fib(30) rekursiv berechnet und
 * dabei jede Fibonacci-Zahl in einer Zeile ausgibt.
 * (b) Schreibe eine weitere Methode, welche die erste Fibonacci-Zahl ≥ 1000 findet und ausgibt.
 *
 * @author <a href="http://github.com/werli">Phil Werli</a>
 */
public class Fibonacci {
    public static void main(String[] args) {
        // (a)
        System.out.println("Teilaufgabe (a):");
        for (int i = 0; i <= 30; i++) {
            System.out.println("Die Fibonacci-Zahl von " + i + " lautet " + fib(i) + ".");
        }

        // (b)
        System.out.println("Teilaufgabe (b):");
        int i = 0;
        int maximum = 1000;
        while (fib(i) < maximum) {
            i++;
        }
        System.out.println("Die erste Fibonacci-Zahl über " + maximum +
                " ist die Fibonacci-Zahl von " + i + " und lautet " + fib(i) + ".");
    }

    /**
     * Berechnet rekursiv die Fibonacci-Zahl für die gegebene Zahl n.
     *
     * @param n Ganzzahlige Zahl, deren Fibonacci-Zahl zurückgegeben wird.
     * @return Fibonaccizahl der gegebenen Zahl n.
     */
    private static int fib(int n) {

        // Deckt fib(0) = 1 und fib(1) = 1 ab.
        if (n == 0 || n == 1) {
            return 1;
        } else {
            // doppelter rekursiver Aufruf deckt fib(n) = fib(n-1) + fib(n-2) ab.
            return fib(n - 1) + fib(n - 2);
        }
    }
}

@@ -1356,24 +1356,331 @@
 b(i) + %22.%22);
+%0A%0A        // alternative L%C3%B6sung f%C3%BCr (b)%0A        System.out.println(%22Rekursiver L%C3%B6sungansatz f%C3%BCr (b):%22);%0A%0A        int n = findFirstFibOver(0, maximum);%0A        System.out.println(%22Die erste Fibonacci-Zahl %C3%BCber %22 + maximum +%0A                %22 ist die Fibonacci-Zahl von %22 + n + %22 und lautet %22 + fib(n) + %22.%22);
 %0A    %7D%0A%0A    
@@ -1930,17 +1930,16 @@
 nt n) %7B%0A
-%0A
         
@@ -2126,24 +2126,24 @@
 ib(n-2) ab.%0A
-
             
@@ -2189,11 +2189,775 @@
  %7D%0A    %7D
+%0A%0A    /**%0A     * Berechnet rekursiv die erste Fibonacci-Zahl %C3%BCber einem%0A     * gegebenem Limit und gibt diese zur%C3%BCck.%0A     * %3Cp%3E%0A     * Diese rekursive L%C3%B6sung wurde im Tutorium von einer%0A     * Teilnehmerin gel%C3%B6st und wurde als alternativer%0A     * L%C3%B6sungvorschlag hinzgef%C3%BCgt.%0A     *%0A     * @param n     Index, welcher um 1 hochgezahlt wird und zur%C3%BCckgegeben wird,%0A     *              wenn die erste Zahl %C3%BCber der Obergrenze gefunden ist.%0A     * @param limit die Obergrenze der Fibonacci-Zahl.%0A     * @return die erste Fibonacci-Zahl %C3%BCber einem gegebenem Limit.%0A     */%0A    private static int findFirstFibOver(int n, int limit) %7B%0A        if (fib(n) %3C limit) %7B%0A            return findFirstFibOver(n + 1, limit);%0A        %7D else %7B%0A            return n;%0A        %7D%0A    %7D
 %0A%7D%0A

Add recursive solution for Fibonacci exercise (b)