Fakultäten in Java berechnen
-
Richtig!
Ausserdem würde ich die Berechnung so ausführen:
long[] fakultaet = new long[33]; fakultaet[0] = 1; for (int i=1; i<fakultaet.length; i++) fakultaet[i] = i*fakultaet[i-1];
-
Javaner schrieb:
Richtig!
Ausserdem würde ich die Berechnung so ausführen:
long[] fakultaet = new long[33]; fakultaet[0] = 1; for (int i=1; i<fakultaet.length; i++) fakultaet[i] = i*fakultaet[i-1];
Stimmt, es klappt auch mit deinem Codebeispiel. Ich dachte, dass man das fakultaet-array komplett mit 1 initialisieren muss, da in der darauffolgenden for-Schleife sonst alle Ergebnisse mit 0 multipliziert werden würden.
Warum es jetzt aber auch so klappt (also lediglich fakultaet[0] = 1), hab ich ehrlich gesagt, noch nicht ganz verstanden
-
Weil die einzelnen Fakultäten sukzessive über den Vorgänger berechnet werden.
f[0] = 1; f[1] = 1 * f[0] = 1 * 1 = 1; f[2] = 2 * f[1] = 2 * 1 = 2; f[3] = 3 * f[2] = 3 * 2 = 6; usw...
-
Fakultät berechnen schreit ja quasi nach Rekursion:
public class Fakultaet { long fakultaet(int x) { if (x == 0) { return 1; } else { return x * fakultaet(x-1); } } public static void main(String[] args) { System.out.print("Die Fakultaet von 13 ist "); System.out.println(fakultaet(13)); } }
-
Ajaw schrieb:
Fakultät berechnen schreit ja quasi nach Rekursion:
Sieht toll aus, aber bei Fakultät ist Rekursion genau das, was man nicht benutzen sollte.
-
Entenverwickler schrieb:
Ajaw schrieb:
Fakultät berechnen schreit ja quasi nach Rekursion:
Sieht toll aus, aber bei Fakultät ist Rekursion genau das, was man nicht benutzen sollte.
Warum nicht? Ich verstehe diesen Einwand ja, wenn es um Fibonaccizahlen oder so geht. Aber bei der Fakultät? Meinst Du, Java hat mit 13 rekursiven Aufrufen ein Problem?
-
BTW: Größere Zahlen lassen sich berechnen indem du dir selber ne Klasse für größe Zahlen schreibst:
Naive Implementierung:
http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/BigInt.java
-
Vertexwahn schrieb:
BTW: Größere Zahlen lassen sich berechnen indem du dir selber ne Klasse für größe Zahlen schreibst:
Naive Implementierung:
http://loop.servehttp.com/~vertexwahn/oldwiki/public_html_an_turing/BigInt.javaDa gibt es schon eine Klasse, nämlich java.math.BigInteger
-
Zum Fall Fakultät berechnen gibt es grundsätzlich zwei Methoden:
-
Iteration while (!exit) {...} oder for (...) {...}
-
Rekursion recursiveFunction(int value) ruft "rekursiv" recursiveFunction(int value)
Beide Methoden haben ihre Vor- un Nachteile:
-
Häufig ist der Code simpler aber dafür muss man einen möglichen Stack-Overflow im Auge behalten.
-
Iterartion rufen sich nicht selber auf, darum wird deshalb kaum ein Stack-Overflow riskiert.
Dafür muss jedoch für etwas mehr "Infrastruktur" gesorgt werden.
Sollte man besser und tiefer erklären, aber zum Thema kann ich nicht mehr beitragen!
Zur Demonstration einer rekursiven Funktion wird gerne das Problem der FakultätsBerechnung genommen.
Fazit: Hierzu sollte eine Fülle an Infos zu finden sein!
-
-
Iterativ:
public static long fakultaet(long n) { long ret = 1; for(int i = 1; i <= n; ++i) { ret *= i; } return ret; }
rekursiv:
public static long fakultaet(long n) { if(n = 1) return 1; else return n * fakultaet(n-1); }
Hoffe, dass die Rekursion so stimmt.
-
Nein, ist sie nicht. Erstens gilt 0!=1 und sollte damit das Abbruchkriterium sein und zweitens wird bei deiner Version, bei n<1, mit hunderprozentiger Sicherheit eine Stackoverflow-Exception auftreten.
Gruss
-
dgsgdter schrieb:
und zweitens wird bei deiner Version, bei n<1, mit hunderprozentiger Sicherheit eine Stackoverflow-Exception auftreten.
Nein! Es wird mit 100% Sicherheit keine Stackoverflow-Exception auftreten.
Dazu müßte das Programm erst mal laufen
und dazu erst mal kompilierbar sein.
( if(n = 1) )
*SCNR*