Binomialkoeffizient iterativ/rekursiv

WIaimy

Mitglied
Hey zusammen!
Sitze grade an der folgenden Aufgabe:

Geben Sie eine long-Methode zur iterativen und rekursiven Berechnung des Binomialkoeffizienten für zwei int-Argumente m und k mit m>=k>=0 an.

Da meine beiden Methoden ein Ergebnis liefern, dass bei der Berechnung von (49 über 6) ~150.000 kleiner ist als gewollt, habe ich mir eine Methode geschrieben, die mir mit Hilfe einer rekursiven Fakultät-Methode eben den Binomialkoeffizienten berechnet. Es ist eine double-Methode geworden, weil ich bei der gleiche methode als long nur Mist rausbekommen - kann es sein, dass ich mit 49! aus dem Bereich von long rausgehe?
Meine Frage ist also:
Wo liegt der Fehler bei meinen beiden ersten Methoden? Eine Zeilenangabe würde mir schon reichen, dann setzte ich mich wieder dran...

Java:
import java.util.Scanner;

public class Aufgabe2 {

	public static void main(String[] args) {

		Scanner einlesen = new Scanner(System.in);
		System.out.println("M = ");
		int m = einlesen.nextInt();
		System.out.println("K = ");
		int k = einlesen.nextInt();
		System.out.println("\nIterativ: " + iterativ(m , k));
		System.out.println("Rekursiv: " + rekursiv(m , k));
		System.out.println("Fakultät / Iterativ2: " + iterativ2(m , k));
		
	}

	private static double iterativ(final int m, int k) {
		if (k == 0)
			return 1.0;
		else {
			double ergebnis = 1.0;
			for (int i = 1; i <= k; i++) {
				ergebnis *= 1.0*((m + (1 - i)) / i);
			}
			return ergebnis;
		}
	}

	private static double rekursiv(final int m, int k){
		if(k == 0)
			return 1.0;
		else
			return rekursiv(m, (k - 1)) * ((m + (1 - k)) / k);
		
	}
	
	private static double fakultät(int zahl){
		if(zahl == 0 || zahl == 1){
			return 1.0;
		}
		return 1.0*fakultät((zahl - 1)) * zahl;
	}
	
	private static double iterativ2(int m, int k){
		return 1.0*(fakultät(m) / (fakultät(k) * fakultät((m - k ))));
	}
}

edit: habe probeweise die oberen Methoden auch double gemacht, mit gleichem falschen Ergebnis
 

Haave

Top Contributor
kann es sein, dass ich mit 49! aus dem Bereich von long rausgehe?
Ja, und zwar bei weitem. Lass dir mal Long.MAX_VALUE ausgeben, da komme ich auf 9223372036854775807. Fakultät 49 hingegen bringt es auf 6.082818640342675 * 10^62 - also deutlich mehr.

Deine fakultät()-Methode lässt sich übrigens kürzer schreiben; es genügt abzufragen, ob zahl == 0, denn wenn zahl == 1, wird ohnehin mal 1 gerechnet. Das "mal 1.0" im else kannst du dir auch sparen.
Java:
public static double factorial(int n) {
	if(n == 0) return 1.0;
	return n * factorial(n-1);
}


Zu Binomialkoeffizienten konkret kann ich leider nicht helfen.
 

Andi_CH

Top Contributor
Hm also google bringt ausnahmsweise viele gute Treffer:

Das ist einer davon

Falls du die Fakultät wirklich für riesige Werte brauchst - das wurde hier schon einmal behandelt und damals habe ich eine Klasse geschrieben die beliebig grosse innteger Zahlen multibplizieren kann.
Ist allerdings schon eine Weile her und ich müsste die Klasse sicher genauer anschauen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
sserio Binomialkoeffizient, wie findet man k und n heraus Java Basics - Anfänger-Themen 18
sserio Binomialkoeffizient n/k Java Basics - Anfänger-Themen 7
H Binomialkoeffizient Java Basics - Anfänger-Themen 6
J Binomialkoeffizient Java Basics - Anfänger-Themen 12
V Binomialkoeffizient-Produktformel Java Basics - Anfänger-Themen 8
K Binomialkoeffizient rekursiv berechnen Java Basics - Anfänger-Themen 8
wuerg Türme von Hanoi Iterativ Java Basics - Anfänger-Themen 8
jhCDtGVjcZGcfzug Fibonacci Zahlen rekursiv und iterativ Java Basics - Anfänger-Themen 21
R Iterativ zeichnen Java Basics - Anfänger-Themen 1
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F Alle Zeichenkombinationen eines Strings iterativ herausfinden Java Basics - Anfänger-Themen 26
F Iterativ in Rekursiv Java Basics - Anfänger-Themen 2
I MergeSort iterativ mit Stacks Java Basics - Anfänger-Themen 13
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
M Werte der Knoten in Binärbaum addieren (iterativ) Java Basics - Anfänger-Themen 6
E Binärbaum - von rekursiv zu iterativ Java Basics - Anfänger-Themen 10
T Methoden Fibunacci Iterativ Java Basics - Anfänger-Themen 6
S java rekursiv iterativ hilfee :s Java Basics - Anfänger-Themen 5
H Suchbaum iterativ absteigen? Java Basics - Anfänger-Themen 3
P Hanoi rekursiv zu iterativ umbauen Java Basics - Anfänger-Themen 20
P QuickSort iterativ Java Basics - Anfänger-Themen 5
M Rekursion Iterativ ausdrücken Java Basics - Anfänger-Themen 3
B Begriff Iterativ Java Basics - Anfänger-Themen 2
J Java Rekursiv vs(zu) Iterativ Hilfe Java Basics - Anfänger-Themen 3
F Sortieralgorithmus von rekursiv auf iterativ? Java Basics - Anfänger-Themen 21
N Fibo Zahlen:iterativ,rekursiv Anzahl der Additionen zählen Java Basics - Anfänger-Themen 2
X Türme von Hanoi - Iterativ Java Basics - Anfänger-Themen 8
T funktion iterativ Java Basics - Anfänger-Themen 4
I Iterativ <-> Rekursiv in Java Java Basics - Anfänger-Themen 11
B von rekursiv zu iterativ Java Basics - Anfänger-Themen 6
F MergeSort iterativ mit Hilfe von Stack Java Basics - Anfänger-Themen 5
H Passwort Brute Force rekursiv Java Basics - Anfänger-Themen 7
1 Array rekursiv durchlaufen Java Basics - Anfänger-Themen 8
E Rekursiv Objekte erzeugen - geht das? Java Basics - Anfänger-Themen 2
Cassy3 Binäre Bäume Rekursiv durchlaufen und bestimmte Elemente Zählen Java Basics - Anfänger-Themen 6
R0m1lly Kombinationen aus int array rekursiv Java Basics - Anfänger-Themen 2
L Rekursiv gegebenes Passwort herausfinden. Java Basics - Anfänger-Themen 2
P9cman Char Index rekursiv finden Java Basics - Anfänger-Themen 4
B Methoden Rekursiv festellen, ob eine Zahl gerade-oft vorkommt oder nicht Java Basics - Anfänger-Themen 4
S Methoden Methodenaufruf rekursiv zählen Java Basics - Anfänger-Themen 4
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
sashady Zahlen rekursiv zerlegen und Ziffern addieren Java Basics - Anfänger-Themen 38
H Binominalkoeffizient tail-rekursiv in java darstellen Java Basics - Anfänger-Themen 0
GAZ Tribonacci Folge Rekursiv Java Basics - Anfänger-Themen 11
A Ackermmanfunktion rekursiv Java Basics - Anfänger-Themen 4
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
G Methode Rekursiv umschreiben Java Basics - Anfänger-Themen 8
L Jede zweite Ziffer entfernen (rekursiv) Java Basics - Anfänger-Themen 6
J Dateien in Verzeichnissen rekursiv auflisten wirft Exception Java Basics - Anfänger-Themen 4
D Pentagonale Nummern in Rekursiv Java Basics - Anfänger-Themen 14
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
E Weg-Suche-Problem rekursiv Java Basics - Anfänger-Themen 12
O Primzahl rekursiv mit einem Wert ohne i, wie? Java Basics - Anfänger-Themen 6
E Erste Schritte Potenz Negativ (rekursiv) Java Basics - Anfänger-Themen 2
O Rekursiv aufrufen Java Basics - Anfänger-Themen 2
F In List Rekursiv suchen Java Basics - Anfänger-Themen 12
S Fibonacci Zahlen rekursiv Java Basics - Anfänger-Themen 1
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
B Wie kann ich Linien rekursiv zeichnen? Java Basics - Anfänger-Themen 4
kilopack15 Sin(x) rekursiv lösen Java Basics - Anfänger-Themen 17
T Rekursiv Tiefe eines binären Suchbaums ermitteln Java Basics - Anfänger-Themen 22
P Methoden Arrays.AsList kleinste Zahl ausgeben Rekursiv Java Basics - Anfänger-Themen 9
W A hoch N Rekursiv Java Basics - Anfänger-Themen 3
K Rechtecke rekursiv zeichnen Java Basics - Anfänger-Themen 20
V Quadrate rekursiv zeichnen Java Basics - Anfänger-Themen 7
M Fibonacci rekursiv mittels Cache Java Basics - Anfänger-Themen 17
Y Rekursiv Palindrom herausfinden Java Basics - Anfänger-Themen 5
B Fibonacci Zahlen rekursiv Array Java Basics - Anfänger-Themen 12
M String rekursiv Spiegeln mit Originalwort davor Java Basics - Anfänger-Themen 3
K Türme von Hanoi - Rekursiv. Java Basics - Anfänger-Themen 1
T MergeSort rekursiv programmieren Java Basics - Anfänger-Themen 8
M Zahlenpyramide rekursiv programmieren Java Basics - Anfänger-Themen 7
hello_autumn Potenz selber berechnen, Rekursiv. Java Basics - Anfänger-Themen 6
V Text wüerfeln-Rekursiv Java Basics - Anfänger-Themen 4
J Baum rekursiv durchlaufen Java Basics - Anfänger-Themen 2
D Münzverteilung Möglichkeiten | Rekursiv Java Basics - Anfänger-Themen 3
R Hanoi rekursiv lösen Problem Java Basics - Anfänger-Themen 1
D Rekursiv Kombinationen ausgeben klappt nur bei einer Wiederholung Java Basics - Anfänger-Themen 4
shiroX OOP String rekursiv zurückgeben Java Basics - Anfänger-Themen 6
Z Fibonacci rekursiv meine Erklärung stimmt so? Java Basics - Anfänger-Themen 2
E Erste Schritte Pi, rekursiv Java Basics - Anfänger-Themen 6
A Frage Methode ggt Rekursiv Java Basics - Anfänger-Themen 5
E Hanoi-Varianten rekursiv Java Basics - Anfänger-Themen 2
P Mittelwert rekursiv Java Basics - Anfänger-Themen 13
E Integral Rekursiv Java Basics - Anfänger-Themen 15
M MergeSort rekursiv Java Basics - Anfänger-Themen 2
D Ziffer in Zahl Rekursiv Java Basics - Anfänger-Themen 4
B Array rekursiv untersuchen Java Basics - Anfänger-Themen 21
I Rekursiv Java Basics - Anfänger-Themen 13
C Rekursiv Zahlenfolgen berechnen mit zwei Variablen Java Basics - Anfänger-Themen 5
K Rekursiv zu Literal Java Basics - Anfänger-Themen 12
R Verzeichnisse rekursiv nach Dateiduplikaten durchsuchen Java Basics - Anfänger-Themen 5
L File Tree rekursiv Java Basics - Anfänger-Themen 10
X Addition rekursiv ohne Schleife Java Basics - Anfänger-Themen 10
M Sudoku Rekursiv lösen Java Basics - Anfänger-Themen 9
E Datentypen ein java problem rekursiv loesen Java Basics - Anfänger-Themen 2
K indexOf selbst rekursiv definieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben