Rekursion Fakultätsfunktion

BlackSalad

Bekanntes Mitglied
Hallo,

ich versuche gerade eigenständig drauf zu kommen wie ich die rekursive Variante der Fakultätsfunktion mache.

Mein Programm soll den eigegeben Parameter für n nehmen und von n dann die Fakultät also n! berechnen.
Leider scheitere ich an dem Programmgerüst irgendwie.

Ich möchte dann auch, dass das Ergebnis oder die zwischenschritte mit einem einfachen System.out.println() ausgegeben werden.
Leider kann ich aber nur innerhalb der Methode "public static void main(String[] args)" diesen Befehl zur ausgabe nutzen.

Und ich habe das Problem, dass meine Klasse FunktionRekursiv nicht weiß was n für ein Parameter ist.

Wie muss ich das denn machen damit es funktioniert?


Danke schonmal 🙂


Hier mein Code:



Java:
public class FakultaetRekursiv {
	

	public static void main(String[] args){
		
	int n=Integer.parseInt(args[0]);
	}
	
	static long FunktionRekursiv (int n) {
		if (n==1){
			return 1;
		}
		else {
			return n*FunktionRekursiv(n-1);
		}
		
	}
	
	
}
 
1) Erstelle in der main eine Instanz der Klasse
2) speicher die Änderungen in n
3) gebe das Resultat aus.

Freihand ohne Gewähr:

Java:
public class FakultaetRekursiv {

    FakultaetRekursiv(int n) {
            System.out.println(funktionRekursiv(n));
    }

    public static void main(String[] args){		
	    new FakultaetRekursiv(Integer.parseInt(args[0]));
    }
	
    private int funktionRekursiv (int n) {
	if (n==1){
		return 1;
	}
	 else {
		return n = n*funktionRekursiv(n-1);
	}		
    }
	
	
}

PS: Funktionen schreibt man klein
 
Zuletzt bearbeitet von einem Moderator:
Leider scheitere ich an dem Programmgerüst irgendwie.
du scheiterst daran, dass java keine nested functions unterstützt. Deine fakultätsfunktion muss neben der main stehen, nicht in der main.
Ich möchte dann auch, dass das Ergebnis oder die zwischenschritte mit einem einfachen System.out.println() ausgegeben werden.
Leider kann ich aber nur innerhalb der Methode "public static void main(String[] args)" diesen Befehl zur ausgabe nutzen.
wie kommst du denn darauf? Du kannst den überall nutzen. Pack's einfach direkt vor dem rekursiven aufruf in deine fakultätsfunktion rein.

Und ich habe das Problem, dass meine Klasse FunktionRekursiv nicht weiß was n für ein Parameter ist.

Wie muss ich das denn machen damit es funktioniert?
1) funktion ordernlich definieren (außerhalb der main)
2) funktion mit dem geparsten parameter aufrufen (in der main)

EDIT:
1) Mache n zu einem Klassen Attribut
2) Erstelle in der main eine Instanz der Klasse
3) speicher die Änderungen in n
das kann doch nicht dein ernst sein? :autsch: Also, nur so zur info: nein, man instanziiert keine neuen Objekte, um eine statische methode aufzurufen.

Java:
public class FakultaetRekursiv {
    
    public static void main(String[] args){
    	int n = Integer.parseInt(args[0]);
    	System.out.println(funktionRekursiv(n));
    }
    
    static long funktionRekursiv (int n) {
        if (n==1){
            return 1;
        } else {
        	long temp = funktionRekursiv(n-1);
        	System.out.println("zwischenschritt: " + temp);
            return (n * temp);
        }
    }
}
Der original-code war schon fast korrekt, nur bisschen komisch eingerückt.
 
Zuletzt bearbeitet:
Danke!

Was mir aber jetzt irgendwie unklar ist, ist folgendes:

Ich hab diese Zeile: "System.out.println(funktionRekursiv(n));" einfach noch in meinen Code eingefügt, jetzt funktioniert es wunderbar.

Aber ich verstehe nicht wieso es bevor ich diese Zeile eingefügt habe immer gemeint hat, dass es nicht weiß was n ist.

Hast du da vielleicht ne Idee für mich?

Ansonsten echt super. Wie man danna n so kleinen DIngen hängen kann. Vielen Dank!
 
und
Java:
long temp = funktionRekursiv(n-1);
            System.out.println("zwischenschritt: " + temp);
            return (n * temp);

hast du nur geändert damit man den Zwischenschritt sieht oder?

Wenn man keinen Zwischenschritt ausgeben lassen will ist das nicht nötig, richtig?

Danke nochmal!
 
Die soll ja auch nicht statisch sein.
Fakultät ist eine klassische mathematische funktion, die frei von jeglichen Einstellungen und Konfigurationsmöglichkeiten einer natürlichen Zahl n eine andere natürliche Zahl n! zuordnet. Warum um Goslings Willen willst du bei jedem Aufruf einer solchen Funktion den Stack mit irgendwelchen Objekt-Instanzen vollstopfen? ???:L

Wenn man keinen Zwischenschritt ausgeben lassen will ist das nicht nötig, richtig?
Genau, wenn man das zwischenergebnis nicht sehen will (was praktisch immer der Fall ist), dann sind die zwei Zeilen überflüssig.

Aber ich verstehe nicht wieso es bevor ich diese Zeile eingefügt habe immer gemeint hat, dass es nicht weiß was n ist.
Wie, was? Wie lautete die fehlermeldung? Bzw. imho dürfte es da keine Fehlermeldungen geben, denn dein ursprünglicher code ist eigentlich ok, er tut nur nichts, weil du die methode nicht aufrufst.
 
Ich ging davon aus, dass er den Zusammenhang von Main zu Geltungsbereich der instanzen ect. nicht verstanden hat. Daher habe ich eine Instanz in der main erzeugt.

Im RealLife hast du natürlich recht. Da programmiert man aber Fakultät nicht neu 😉
 
Danke euch allen!

Jetzt hab ich nochmal ne Frage und zwar soll meine Funktion den größten gemeinsamen Teiler berechnen.
Allerdings tut sie das irgendwie fehlerhaft. Ich finde aber meinen Fehler nicht.

Java:
public class ggTklassisch {
	
	public static void main(String[] args){
		int a=Integer.parseInt(args[0]);
		int b=Integer.parseInt(args[1]);
		
		System.out.println(ggT(a, b));
	}

	static long ggT(int a , int b){
		
		if(a>b){
			return ggT(a-b,b);
		}
		else if (a<b){
			return ggT(a, b-a);
		}
		else {
			return a;
		}
	}
	
	
}
 
ja habe ich. Er funktioniert auch für kleinere Zahlen bzw. für die die ich ausprobiert habe.

Aber für Testwerte die ich gefunden habe, funktioniert er nicht.
 
Achso 😉


Ich habe als Testwert 3528 und 2100 genommen. Rauskommen soll 8.
Bei mir kommt aber 84 raus.

Bei 16 und 14 stimmt das ergebnis und bei anderen zahlen auch die ich ausprobiert habe. Aber bei dieser größeren stimmt es nicht. :noe:
 
Warum sollte da 8 rauskommen ???:L
3528 / 84 = ganzzahl
2100 / 84 = ganzzahl
84 ist schon richtig.
 
Dann find ichs super, dass meine Uni fehler in ihren Vorlesungsfolien hat 😱

Danke. Dann hat sich das erledigt... Hab bei nem anderen Zahlenbeispiel auch nachgerechnet und auch das wurde falsch angegeben. :noe:

Vielen Dank!!
 
Dann find ichs super, dass meine Uni fehler in ihren Vorlesungsfolien hat 😱

Danke. Dann hat sich das erledigt... Hab bei nem anderen Zahlenbeispiel auch nachgerechnet und auch das wurde falsch angegeben. :noe:

Vielen Dank!!

Das Fehler auf Folien sind kommt immer mal vor, dass hat wenig mit der Qualität deiner Uni zu tun. Ab und an sollte man halt mal selbst prüfen ob das was auf den Folien steht stimmt oder eben nicht.
 

Neue Themen


Zurück
Oben