Fakultäten

Murmeltier1985

Aktives Mitglied
so, die letzte Frage für heute ;-) :

Kann mir wer sagen wie ich Fakultäten in Java berechne:

Ich habe z.B. als mein "n" = 5 gewählt.

nun soll Java : 1*2*3*4*5 rechnen. Wie drück ich das denn allgemeingültig aus, dass er jede Ziffer multiplizieren soll?

Danke Sarah
 

eRaaaa

Top Contributor
Java:
    public static long fak(int n) {
	long erg = 1;
	for (int i = 1; i <= n; i++) {
	    erg *= i;
	}
	return erg;
    }

Aber mal eine andere Frage: Brauchst du das für die Berechnung des Binominialkoeffizienten?
 

Murmeltier1985

Aktives Mitglied
wollte das so lösen:

Bsp: n=3; k= 5

5! = 5! = 1*2*3*4*5 = 120 =10
3!*(5-3)! 3!*2! (1*2*3)*(1*2) 12

oder kennst du ne bessere Variante?
 
Zuletzt bearbeitet:

Ein Keks

Bekanntes Mitglied
hier is doch zeit neustens immer min eine aufgabe 5mal vertreten diese woche sind es halt binominalkoeffizient und tic tac toe xD
hier zum spaß nochmal rekursiv:
Java:
    public static long fac(int n) {
    if(n=0 || n=1){return 1;}
    return n * fac(n-1);
    }

edit:
Bsp: n=3; k= 5

5! = 5! = 1*2*3*4*5 = 120 =10
3!*(5-3)! 3!*2! (1*2*3)*(1*2) 12
verwirrendes besipiel muss man erst ma drauf kommen dass das als bruch gemeint ist xD
aber vom prinzip richtig: 5C3 = fac(5)/(fac(3)*fac(5-3))
wobei n und k vertauscht sind ( n<k wär auch seltsam)
 
Zuletzt bearbeitet:

Murmeltier1985

Aktives Mitglied
Ist doch schön wenn sich ganz viele auf einmal mit Java befassen :D

Wie gesagt wir sind 80 Studenten und müssen uns Java quasi selbst beibringen, da sind solche schönen Tipps von euch echt überlebenswichtig..
 

Ein Keks

Bekanntes Mitglied
gibt übrigens auch eine rekursive herleitung des binominalkoeffizienten:
n C k = (n-1) C (k-1) + (n-1) C k
mit den abbruchbedingungen n C 0 = 1 und n C k = 0 für k>n
(n C k bedeutet n über k gibt grad keine bessere darstellung)
 

Landei

Top Contributor
Man kann die Fakultät in Java auch funktional berechnen:

Java:
public interface Lambda {
    public Object apply(Object x);
}

public class Factorial {
 public static void main(String[] args) {
  final int x = new Integer(args[0]);
  
  System.out.println(x + "! = " + 
  ((Lambda)(new Lambda() {
   public Object apply(final Object f) {
    return new Lambda() {
     public Object apply(final Object x) {
      return ((Lambda)f).apply(new Lambda(){
       public Object apply(final Object y) {
        return ((Lambda)((Lambda)x).apply(x)).apply(y);
       }       
      });
     }     
    }.apply(new Lambda() {
     public Object apply(final Object x) {
      return ((Lambda)f).apply(new Lambda(){
       public Object apply(final Object y) {
        return ((Lambda)((Lambda)x).apply(x)).apply(y);
       }       
      });
     }     
    });    
   }   
  }.apply(new Lambda(){
   public Object apply(final Object f) {
    return new Lambda() {
     public Object apply(final Object x1) {
      final int x = (Integer)x1;
      return x == 0 ? 1 : x * (Integer)((Lambda)f).apply(x -1);      
     }
    };
   }   
  }))).apply(x));
 }
}

( One Div Zero: Java Is Too Academic )
 

Murmeltier1985

Aktives Mitglied
@ ein Keks:

Hab es jetzt versucht über deine Methode zu lösen, bekomme aber in dieser Zeile immer folgenden Fehler:

Java:
if(n=0 || n=1){return 1;}

Fehler: Multiple markers at this line
- The operator || is undefined for the argument type(s) int,
boolean
- Syntax error on token "=", != expected


Kannst du mir nen Tipp geben?
 

Murmeltier1985

Aktives Mitglied
Okay, ich dachte so sollte es klappen:

Java:
public static long fac(int n) {
				    if(n=0) {return 1;}
				    if(n=1) {return 1;}
				    return n * fac(n-1);

Da bekomm ich den Fehler: Type mismatch: cannot convert from in to boolean

kann ich das jetzt ganz normal parsen oder geht das nicht von int zu boolean?
 

icarus2

Top Contributor
Also es ist sicher eine gute Übung Fakultät rekursiv zu programmieren, da es ein sehr einfaches Beispiel ist.

Aber wenn man es sich überlegt, so ist es eigentlich für eine praktische Anwendung unsinnig Fakultät rekursiv zu programmieren. Für kleine Zahlen mag dies ja noch nicht so ins Gewicht fallen, aber bei grossen Zahlen dürfte eine einfache for-Schleife viel effektiver sein.
 

Ein Keks

Bekanntes Mitglied
Code:
if(n=0 || n=1){return 1;}
verdammt ist das peinlich xD
@icarus2 bei großen zahlen reicht auch kein long mehr aus^^... aber hast natürlich vom prinzip her recht. rekursion ist immer teuerer aber so schön ellegant :) und bei ner übungaufgabe isses eh egal
 

icarus2

Top Contributor
Stimmt, long reicht da schon recht schnell nicht mehr ^^ Ich hatte früher auch mal so etwas gemacht und musste dann BigInteger nehmen.
 

Ähnliche Java Themen

Neue Themen


Oben