Fibonacci-Linear und Rekursiv

medicus

Mitglied
Hallo Leute.Ich hab grad angefangen mit Java und hab als Übungsaufgabe folgendes Problem bekommen.
Vielleicht könnt ihr mir ja helfen und weil ich echt überfordet bin

Aufgabe:
Implementieren Sie eine rekursive Methode, die die n-te Fibonacci-Zahl in linearer Zeit berechnet.
Gestalten Sie die Rekursion so, dass zusätzlich zu anderen Parametern die beiden
letzten Fibonacci-Zahlen als Parameter übergeben werden. Wertzuweisungen sollen in der
rekursiven Methode nicht verwendet werden. Testen Sie die Methode mit einer Anwendung.
Diese Anwendung muss eine ausführbare Klasse sein, d.h. eine Methode
public static void main (String[] args)
enthalten.


Lösungsvorschläge?

Im internet bin ich auf folgender Lösung gestoßen:


Rekursive Fakultät

Java:
int factorial(int n) {
if(n<=1) return 1;
return n*factorial(n-1);
}


Endrekursion mittels Hilfsfunktion
Java:
int g_factorial(int n, int fac) {
if (n<=1) return fac;
return g_factorial(n-1, fac*n);
} int factorial(int n) {
return g_factorial(n, 1);
}

Durch Einführen der Hilfsfunktion g_factorial wird
die nachträgliche Multiplikation vermeiden.
=> Die Rekursion ist nun endrekursiv.



Vielen lieben Dank für eure Hilfe

Anna
 

Marco13

Top Contributor
Hmja ... die endrekursive Darstellung der Fakultät und ein linearer Fibinacci haben IMHO erstmal nicht so viel miteinander zu tun... Du kennst vermutlich die Definition der Fibonacci-Zahlen, und hast vermutlich auch schon eine rekursive Implementierung ergooglet... Hast du eine Idee, was du jetzt machen musst?
 

Landei

Top Contributor
Eine naive rekursive Implementierung von Fibonacci-Zahlen hat eine grottenschlechte Performance, der Trick ist, in der einen oder anderen Form zwei benachbarte Fibonacci-Zahlen mitzuschleifen, etwa so:

Java:
public int fibo(int n) {
   fiboHelper(0, 1, n);
}

public int fiboHelper(int a, int b, int n) {
  return n == 0 ? a : fiboHelper(b, a+b, n-1);
}

Es gibt noch wesentlich schnellere Versionen (z.B. basierend auf Formeln, die aus fibo(n) und fibo(n+1) die Werte fibo(2n) und fibo(2n+1) berechnen)
 

medicus

Mitglied
Hallöchen.Ich bins wieder

Ich hab eure Ratschläge beherzt-Danke <3

Ich weiß wie die Fibonacci Zahlen gebildet werden:

Bsb:

f(O)=0
f(1)=f(0)+f(1)=1
f(2)=f(0)+f(1)=1

...
f(n)=f(n-2)+f(n-1)



Leider kann ich die geforderte Aufgabe immer noch nicht lösen :(


Ich würd mich ganz dolllll freuen wenn ihr mir hilft

danke und kussis

anna
 

medicus

Mitglied
Hi,

Ist die Aufgabe echt gelöst ???

Dies ist ja ein Forum für Anfänger so wie ich :)
ES tut mir leid wenn ich so dumm nachhake.Ich bin absolute Programmierenversagerin :(
Deswegen kann ich nicht sehen wie die Aufgabe gelöst sein soll?


Hilft mir bütte

LG
anna
 

kay73

Bekanntes Mitglied
Zuletzt bearbeitet:

medicus

Mitglied
ALso erstmal danke an euch alle :)


Die Aufgabe lautete ja:
Implementieren Sie eine rekursive Methode, die die n-te Fibonacci-Zahl in linearer Zeit berechnet.
Gestalten Sie die Rekursion so, dass zusätzlich zu anderen Parametern die beiden
letzten Fibonacci-Zahlen als Parameter übergeben werden. Wertzuweisungen sollen in der
rekursiven Methode nicht verwendet werden. Testen Sie die Methode mit einer Anwendung.
Diese Anwendung muss eine ausführbare Klasse sein, d.h. eine Methode
public static void main (String[] args) enthalten.



Ich hab herausgefunden, dass linear und endrekusiv dasselbe meint.
In der Methode fiboHelper werden die beiden letzten Fibonacci zahlen übergeben
Ich habe mit einer Anwendung getestet und hab dazu a=1, b=2 und n=8 gewählt.
Zusätzlich hab ich den code so kommentiert wie ich versteh
Leider funktioniert das Programm immer noch nicht ;(
Java:
public class Fibijo {

public static void main (String[] args){

// Ich teste die Aufgabe mit folgenden drei Werten
	int n=8;
	int a=1;
	int b=2;

// Methode int Fibi wird dekleriert und bekommt int n übergeben	
public int Fibi(int n) {
//fiboHelper bekommt 0, 1, und n übergeben
   fiboHelper(0, 1, n);
}

// methode fiboHelper wird dekleriert und bekomm a, b und n übergeben
public int fiboHelper(int a, int b, int n) {
// Wenn n 0  ist , gibt die methode 0 zurück ansonsten wird (2,2+1,8-1) übergeben diesen Ausdruck versteh ich nicht ganz
return n == 0 ? a : fiboHelper(b, a+b, n-1);
}
}
}


Save me guys
anna
 

kay73

Bekanntes Mitglied
Ich hab herausgefunden, dass linear und endrekusiv dasselbe meint.
Erzähl das bloß nicht deinem Dozenten... Weisst Du auch genau, was man eigentlich von Dir will? Dass in der Aufgabe mit "linear" eine Laufzeit gemeint ist? Warum diese Rekursion lineare Laufzeit hat im Gegensatz zu sowas wie
Code:
fib(n) = fib(n-1) + fib(n-2)
?

Java:
public class Fibonacci {

	public int fibonacci(int n) {
		return fiboHelper(0, 1, n);
	}

	private int fiboHelper(int a, int b, int n) {
		return n == 0 ? a : fiboHelper(b, a + b, n - 1);
	}

	public static void main(String[] args) {

		final Fibonacci f = new Fibonacci();
		System.out.println(f.fibonacci(8));
	}
}
 
Zuletzt bearbeitet:

medicus

Mitglied
Hi Kay73.

Echt dickes Dankeschön für dein Hilfe <3

So wie es verstanden habe bedient man sich dann der O-Notation um die Laufzeitlänge herauszufinden. (Landauysmbole)

wobei:
O(n) bedeutet lineares Wachstum
Sei a element aus O(n), so wächst a ungefähr auf das Doppelte, wenn sich n verdoppelt.

bei dieser Rekursion ist dies ja nicht der fall
fib(n)=fib(n-1)+fib(n-2)

Beispiel:
f(1)=1
f(2)=1
f(3)=2
f(4)=3

Ich versuch mir das grad noch am Java-Code klar zu machen in dem ich die Laufzeit bestimme
Wie geh ich da am besten ran, wenn ich zu deinem Code die Laufzeit berechnen will


Ps: Danke.Hasst mir schon echt sehr viel weiter geholfen.So langsma wirds

LG
anna
 

Landei

Top Contributor
Hier eine schnelle Implementierung, allerdings mit BigIntegern:

Java:
   //Geklaut von code.google.com/p/birpn
   private static BigInteger fib(BigInteger n) {
        if (n.signum() < 0) {
            throw new ArithmeticException("Argument must be non-negative.");
        }
        if(n.compareTo(BigInteger.ONE) <= 0) {
            return n;
        }
        BigInteger x = BigInteger.ONE;
        BigInteger y = BigInteger.ZERO;
        for(int k = n.bitLength() - 2; k >= 0; k--) {
            BigInteger xx = x.multiply(x);
            x = xx.add(x.multiply(y).shiftLeft(1));
            y = xx.add(y.multiply(y));
            if(n.testBit(k)) {
                BigInteger temp = x;
                x = x.add(y);
                y = temp;
            }
        }
        return x;
    }
 

Landei

Top Contributor
Ich habe auch keine Ahnung, welches O mein Code hat (ich würde mal spontan auf O(n log(n)) tippen). Aber was soll verkehrt daran sein, unterschiedliche Implementierungen vorzustellen?
 

Geeeee

Bekanntes Mitglied
Sollte passen mit deiner Laufzeit.

Etwas ot:
Hab mich vor einem Monat ca. mal etwas mehr mit Fib und Java beschäftigt: Is doof mit BigInteger, da immer wieder neue Objekte rausgehauen werden. Ab ca. einer Million wird es sehr übel. Muss man sich Alternativen suchen, wenn man es richtig angehen will.
Mal ein wenig Lesestoff für effiziente Algorithmen:
Das Fibonacci number
basierend auf dem:
repeated squaring
(stelle gerade fest, dass bei mir die Links zur Zeit nicht funktionieren. Ist aber auch im GoogleCache nachzulesen)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Abwandlung der Fibonacci Folge Java Basics - Anfänger-Themen 3
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
123456789sssssaaaa Which is the best way to Print Fibonacci Series in Java? Java Basics - Anfänger-Themen 3
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
J Fibonacci-Reihe Java Basics - Anfänger-Themen 12
G Fibonacci Zahlenreihe Fehler Java Basics - Anfänger-Themen 4
D Fibonacci overflow integer Java Basics - Anfänger-Themen 8
B Fibonacci Zahlen dynamische Programmierung Java Basics - Anfänger-Themen 7
N Dynamisches Programmieren/Fibonacci Java Basics - Anfänger-Themen 1
V Fibonacci Folge Java Basics - Anfänger-Themen 4
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
A Fibonacci Zahlen Java Basics - Anfänger-Themen 1
M Methoden Fibonacci-Folge Java Basics - Anfänger-Themen 6
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
P Fibonacci -Verallgemeintert Java Basics - Anfänger-Themen 2
K Methoden Fibonacci in Array mit rekursiver Methoden Java Basics - Anfänger-Themen 19
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
K Fibonacci Zahlen Java Basics - Anfänger-Themen 3
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
P fibonacci - do while Statement Logik Fehler Java Basics - Anfänger-Themen 5
A Fibonacci-numbers Java Basics - Anfänger-Themen 9
K Rekursion Fibonacci Java Basics - Anfänger-Themen 3
J Fibonacci Zahlen berechnen Java Basics - Anfänger-Themen 3
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
Z Fibonacci Array Erklärung Java Basics - Anfänger-Themen 5
A Gerade Terme der Fibonacci-Folge aufsummieren Java Basics - Anfänger-Themen 12
M Fibonacci, Fakultaet, GGT Java Basics - Anfänger-Themen 9
C Fibonacci Zahlen Java Basics - Anfänger-Themen 7
J Ausgabe der fibonacci Zahlen Java Basics - Anfänger-Themen 4
S Fibonacci Folge Java Basics - Anfänger-Themen 34
D Fibonacci Java Basics - Anfänger-Themen 11
W Fibonacci Zahlenberechnung Java Basics - Anfänger-Themen 9
X Fibonacci mit durchschnittlicher Zeit Java Basics - Anfänger-Themen 5
I Fibonacci-Folge , direkter Weg. Java Basics - Anfänger-Themen 5
G Fibonacci Algorithmus Java Basics - Anfänger-Themen 22
0 Fibonacci Zahlen seeeehr schnell berechnen Java Basics - Anfänger-Themen 9
S Fibonacci Rückrechnung! Java Basics - Anfänger-Themen 5
K Fibonacci Zahlen Java Basics - Anfänger-Themen 2
K Programmieren von den ersten 70 Fibonacci-Zahlen Java Basics - Anfänger-Themen 2
G fibonacci was stimmt an meinem code nicht? Java Basics - Anfänger-Themen 2
S Fibonacci Zahlenvergeich Java Basics - Anfänger-Themen 6
G Iterativer Algorithmus zur Berechnung der Fibonacci Zahlen Java Basics - Anfänger-Themen 1
P Fibonacci-Zahlen Java Basics - Anfänger-Themen 6
R Linear Regression Java Basics - Anfänger-Themen 3
B Wie schreibt ihr eure Programme? Klassenweise oder linear? Java Basics - Anfänger-Themen 10
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben