Fibonacci, Fakultaet, GGT

Melisa

Mitglied
Hallo Leute, in der Uni haben wir vor kurzem mit Java angevangen und ich habe ein Projekt, das so aussieht

public class HelloJavaImpl implements HelloJava {

public int fib(int n) {
if((n==0) || (n==1)) //fib(0)=0; fib(1)=1
return n;
else
return fib(n-1) + fib(n-2);
}

public int fac(int n) {
if((n==0) || (n==1))
return 1;
if(n<0)
return -1;
else
return fac(n-1)*n;
}

public int ggT(int a, int b) {
int min = Math.min(a,b); //Ich habe schon kleinere Zahl
for(int i=min; i>=2; i--){ //Ich teste alle Zahle bis zur Zwei
//Wenn bis dahib kein ggt gefunden wurde, bleibt nur die 1
if(a%i==0 && b%i==0)
return i;
}return 1; //Falls kein ggt gefunden wurde
}

}
ich weiss nicht, was ich machen soll um das Program zu funktionieren. Bitte helft mir
 
wie kann man das eigentlich so häufig überlesen....???

[edit]ok, mit einem hübschen Bild darf man alles 🙂
image.php
[/edit]
 

Anhänge

  • Unbenannt.PNG
    Unbenannt.PNG
    28,6 KB · Aufrufe: 43
Zuletzt bearbeitet:
Ja ich weiss, dass ich main Methode brauche aber genau das verstehe ich nicht, wie soll ich main Methode schreiben.
Ich bin Anfaenger und verstehe ich nicht wie Unterprogramme aufgerufen werden sollen.
 
jojo... dir fehlt -wie schon erwähnt- die main-Methode...hier mal ein rudimentäres Bsp dafür...:

Java:
public class HelloJavaImpl implements HelloJava {

	public static void main(String[] args) {
		HelloJavaImpl hji = new HelloJavaImpl();
		System.out.println("Fakultäten:");
		for (int i = 0; i < 15; i++) {
			System.out.println("\tDie Fakultät von " + i + " ist= "
					+ hji.fac(i));
		}
		System.out.println("\nFibonacci: (die ersten 25 Glieder)");
		for (int i = 0; i < 25; i++) {
			System.out.print(hji.fib(i) + ", ");
		}

		System.out.println("\nGGT von 88 und 983252");
		System.out.println("\t" + hji.ggT(88, 252));
	}

	public int fib(int n) {
		if ((n == 0) || (n == 1)) // fib(0)=0; fib(1)=1
			return n;
		else
			return fib(n - 1) + fib(n - 2);
	}

	public int fac(int n) {
		if ((n == 0) || (n == 1))
			return 1;
		if (n < 0)
			return -1;
		else
			return fac(n - 1) * n;
	}

	public int ggT(int a, int b) {
		int min = Math.min(a, b); // Ich habe schon kleinere Zahl
		for (int i = min; i >= 2; i--) { // Ich teste alle Zahle bis zur Zwei
			// Wenn bis dahib kein ggt gefunden wurde, bleibt nur die 1
			if (a % i == 0 && b % i == 0)
				return i;
		}
		return 1; // Falls kein ggt gefunden wurde
	}

}
 
jgh vielen vieleen vieeleeen Dank, du hast mir geholfen, schon 2 Tagen sitze ich am Komputer und versuche diese Ahufgabe zu loesen. Danke dir
 
btw:
[STRIKE]die fac() ist inhaltlich falsch.

0! == 0[/STRIKE] Sorry, war Fehlinfo von mir! Danke an jgh.
0! == 1 Erstaunt mich zwar, ist aber als Null-Element der Multiplikation nachvollziehbar
1! == 1

Aber
(-n)! == undefiniert! Da sollte ein Error oder eine exception kommen! oder NaN zurückgeben
und warum wird das für fib(-n) nicht überprüft?

Eine Rückgabe von (-1) ist für "Fehlermarkierung"
  • eine antike Methode
  • in Java nicht mehr zeitgemäß
  • verlangt vom Benutzer dieser Klasse hohe Disziplin.
  • sehr fehleranfällig

(Was, wenn der Benutzer den Rückgabewert "blind" weiterverwendet?
Selbst Schuld vom Benutzer?
oder ist der Designer der Classe zu bequem, nicht gründlich genug?)
 
Zuletzt bearbeitet:
btw die Fakultät von 0 ist 1.

[edit] aber bei den grundsätzlichen Sachen(negativen Zahlen und Rückgabe von -1) gebe ich dir Recht 😉[/edit]
 
Zuletzt bearbeitet:
Man kann den ggt übrigens auch mit dem euklidischen Algorhithmus berechnen. Deine Lösung ist zwar auch richtig, aber sie basiert noch auf Ausprobieren. Ich finde auch, dass sich sowas prima zum Einsetzen von Rekursivität lohnt.

Bei Interesse kannst du dir das ja mal durchlesen 😉
Euklidischer Algorithmus

Der Code ist dann auch viel kürzer, indem man die Methode in sich selbst mit den anderen Werten neu aufruft, bis der GGT gefunden wurde.

Java:
public static int GGT(int a, int b){
		if (b == 0)
			return a;
		return GGT(b, a % b);
		}

Man kann das sogar noch etwas verkürzen, indem man eine Kurzform wählt, was aber im Endeffekt dasselbe bedeutet:
Java:
public static int GGT(int a, int b){
		return b == 0 ? a : GGT (b, a % b);
}

Ich hoffe ich konnte dir damit ein paar Tipps geben, wie man seinen Code verbessern kann, immerhin ist die Methode bei größeren Zahlen auch erheblich schneller 😉
 
Zuletzt bearbeitet:

Zurück
Oben