
Danke erstmal für den Hilfsansatz aber ich werd nicht schlau aus dieser Aufgabe. Ich hab es jetzt anders versucht. In der Aufgabe steht ja irgendwas von Fibonnaci nummern und Pell folgen. Beides sagt mir was und die beiden Sachen als Methode umzusetzen war auch wirklich kein Problem.Tabelle kann ein einfaches Array sein. Wenn Du n Werte berechnen willst, dann brauchst Du ein Array entsprechender Größe.
Dabei ist noch zu beachten: Da wir mit dem 0ten Wert anfangen, braucht man zur Speicherung des Wertes Ln ein Array mit eine Größe von mindestens n+1. (Ein Array der Größe x hat die Indices von 0 bis x-1!)
Und Du brauchst einen Wert, der Signalisiert, dass etwas noch nicht berechnet wurde. Das kann z.B. ein Wert sein, der nicht vorkommen kann (-1, 0, Integer.MIN_VALUE, ...) oder man nutz einen Typ, der null erlaubt (also z.B. Array von Integer statt int).
Es gibt auch noch weitere Möglichkeiten aber die zwei Möglichkeiten reichen evtl. schon aus ....
Reichen die Informationen, um weiter zu machen?
public class LukasFolgen {
public static void main(String[] args) {
LukasFolgen l = new LukasFolgen();
l.printAllFib(7);
System.out.println(" Jetzt pell");
l.printAllPell(7);
}
public static int fib(int a) {
if (a == 0)
return 0;
if (a == 1)
return 1;
else
return fib(a - 1) + fib(a - 2);
}
public void printAllFib(int a) {
for (int i = 0; i < a; i++) {
System.out.println(fib(i));
}
}
public static int pell(int n) {
if (n <= 2) {
return n;
}
return 2 * pell(n - 1) + pell(n - 2);
}
public void printAllPell(int a) {
for (int i = 0; i < a; i++) {
System.out.println(pell(i));
}
}
}
public static int lukas(int a, int p, int q) {
if (a == 0)
return 0;
if (a == 1)
return 1;
else
return p*fib(a - 1) - q*fib(a - 2);
}
Oha gerade, wo du es geschrieben hast, hab ich es ausprobiert gehabt und ja es klappt mehr oder weniger, aber so einfach ist die Aufgabe, dann doch nicht.Wenn ich mich nicht verschaut habe, erhältst Du den primitiv-rekursiven Ansatz der Lukasfolge doch einfach aus der fib-Methode, indem Du p und q einführst:
Java:public static int lukas(int a, int p, int q) { if (a == 0) return 0; if (a == 1) return 1; else return p*fib(a - 1) - q*fib(a - 2); }
EDIT: das else am Ende kannst Du Dir übrigens sparen.
Naja, das sind normale mathematische Formulierungen: i kennzeichnet das i-te Folgenglied und n kennzeichnet die Anzahl der zu berechnenden Folgenglieder. Dein Parameter a von printAllFib entspricht also dem n, und der Parameter a von fib entspricht dem iMich verwirrt in der Aufgabenstellung die Variablen i und n; wo liegt denn der unterschied zwischen den beiden erfragen?
Hier wurde ein Array empfohlen, keine ArrayList. Wenn Du ein Array der Größe n nimmst, kannst Du die i-te Lukaszahl ja an der i-ten Stelle des Arrays speichern.muss ja jetzt alle Berechnungen irgendwo speichern und sicherstellen, dass jedes Element nur 1 Mal gespeichert ist. Hier wurde dafür eine Arraylist empfohlen
Wenn ich mich nicht verschaut habe, erhältst Du den primitiv-rekursiven Ansatz der Lukasfolge doch einfach aus der fib-Methode, indem Du p und q einführst:
Java:public static int lukas(int a, int p, int q) { if (a == 0) return 0; if (a == 1) return 1; else return p*fib(a - 1) - q*fib(a - 2); }
EDIT: das else am Ende kannst Du Dir übrigens sparen.
public static int lukas(int a, int p, int q, Integer[] werte) {
if (werte == null) {
werte = new Integer[a];
}
if (werte[a] != null)
wert[a]=Berechnung; return wert[a];
==> Wir müssen den Wert ja speichern, damit der Wert nur einmal berechnet wird. Und in den Rekursiven Aufrufen muss natürlich das Array auch mit übergeben werden.Du brauchst weder ein Array noch eine Liste noch irgend eine andere Klasse aus java.util, wenn du es effizient implementieren möchtest.Zwei "Laufvariablen" in deiner rekursiven Methode reichen aus.
Die Aufgabe verlangt aber explizit eine Lookup-Tabelle. Daher sind Optimierungen schön, aber wohl nicht Zielführung wenn es um die Lösung der Aufgabe geht.Du brauchst weder ein Array noch eine Liste noch irgend eine andere Klasse aus java.util, wenn du es effizient implementieren möchtest.Zwei "Laufvariablen" in deiner rekursiven Methode reichen aus.
public class LukasFolgen {
public static void main(String[] args) {
if (args.length == 3) {
try {
printlukas(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]));
} catch (Exception e) {
System.out.println("Error " + e.getMessage());
}
} else {
System.out.println("Fehler");
}
}
public static int fib(int a) {
if (a == 0)
return 0;
if (a == 1)
return 1;
else
return fib(a - 1) + fib(a - 2);
}
public void printAllFib(int a) {
for (int i = 0; i < a; i++) {
System.out.println(fib(i));
}
}
public static int lukas(int a, int p, int q) throws Exception {
if (a == 0)
return 0;
if (a == 1)
return 1;
return p * fib(a - 1) - q * fib(a - 2);
}
public static void printlukas(int a, int p, int q) throws Exception {
for (int i = 0; i < a + 1; i++) {
System.out.println(lukas(i, p, q));
}
}
}
Und kann es sein, dass ich noch einen Denkfehler habe ? Diese Formel soll doch, dass i te Folgeglied berechnen und n hingegen wird der Methode mitgeben und die beiden müssen verglichen werden ? Aber wie setz ich das um bzw wie mach ich ersichtlich, dass das i-te Glied berechnet wird ?Die lookUp Tabelle ist noch unwichtig. Erstmal sollte die Formel klappen xD
Code:public class LukasFolgen { public static void main(String[] args) { if (args.length == 3) { try { printlukas(Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2])); } catch (Exception e) { System.out.println("Error " + e.getMessage()); } } else { System.out.println("Fehler"); } } public static int fib(int a) { if (a == 0) return 0; if (a == 1) return 1; else return fib(a - 1) + fib(a - 2); } public void printAllFib(int a) { for (int i = 0; i < a; i++) { System.out.println(fib(i)); } } public static int lukas(int a, int p, int q) throws Exception { if (a == 0) return 0; if (a == 1) return 1; return p * fib(a - 1) - q * fib(a - 2); } public static void printlukas(int a, int p, int q) throws Exception { for (int i = 0; i < a + 1; i++) { System.out.println(lukas(i, p, q)); } } }
Das habe ich bisher. Fehlerbehandlung ist auch schon drinnen, aber die allgemeine Folge klappt eben nur für Fibonnaci und das ist das Problem. Ist der Sinn von Rekursion nicht eh eigentlich, dass sich die Methode selbst aufruft und nicht eine andere Methode ( wie hier fib())?
static int lukas(int n, int p, int q) {
if (n == 0)
return 0;
if (n == 1)
return 1;
return p * lukas(n - 1, p, q) - q * lukas(n - 2, p, q);
}
static int lukas(int n, int p, int q, int nMinus1, int nMinus2) {
return p * nMinus1 - q * nMinus2;
}
static int lukas(int n, int p, int q) {
return lukas(n, p, q, 1, 0);
}
static int lukas(int n, int p, int q, int nMinus1, int nMinus2) {
return lukas(n, p, q, p * nMinus1 - q * nMinus2, nMinus1);
}
static int lukas(int n, int p, int q, int nMinus1, int nMinus2) {
return n <= 0 ? nMinus2 : lukas(n - 1, p, q, p * nMinus1 - q * nMinus2, nMinus1);
}
for (int i = 0; i <= n; i++) {
System.out.println(lukas(i, 1, -1));
}
static void lukas(int n, int p, int q) {
lukas(n, p, q, 1, 0);
}
static void lukas(int n, int p, int q, int nMinus1, int nMinus2) {
System.out.println(nMinus2);
if (n > 0) {
lukas(n - 1, p, q, p * nMinus1 - q * nMinus2, nMinus1);
}
}
public static void main(String[] args) {
lukas(7, 1, -1);
}
Wieso sollte ich nicht einfach einen TreeSet benutzen? Der steckt im util Paket und hört sich doch genau nach dem an, was ich brauche oder ? Keine duplikate und sortiert
Sorry, in meinem Code hatte sich ein Copy & Paste-Fehler eingeschlichenDer Ansatz funktioniert doch nicht so einfach wie da. Für die Fibonnaci nummern funktioniert zwar alles, aber wenn ich die Pellnummern will, kommen falsche Zahlen. Uff was nun