001 package de.hska.info1.binomi;
002
003 /**
004 * BinomialKoeffizient ist verantwortlich für
005 * die Berechnung des Binomialkoeffizienten
006 * mit dem Pascalschen Dreieck.
007 * Diese Klasse enthält eine Implementierung, bei
008 * der das Dreick adaptiv vergrössert wird.
009 *
010 * @author Christian Pape
011 */
012 public class BinomialKoeffizient {
013
014 private int [][] pascalscheDreieck;
015
016 /**
017 * Erzeugt ein BinomialKoeffizient
018 * mit dem alle Binomialkoeffizienten bis
019 * maximal n über k berechnet werden
020 * können.
021 */
022 public BinomialKoeffizient() {
023 pascalscheDreieck = new int[1][1];
024 pascalscheDreieck[0][0] = 1;
025 }
026
027 private void pascalscheDreieckBerechnen() {
028 for (int n = 0; n < pascalscheDreieck.length; n++) {
029 pascalscheDreieck[n][0] = 1;
030 pascalscheDreieck[n][n] = 1;
031 }
032
033 for (int n = 2; n < pascalscheDreieck.length; n++) {
034 for (int k = 1; k < n; k++) {
035 setNUeberK(n, k,
036 pascalscheDreieck[n-1][k-1] + pascalscheDreieck[n-1][k]);
037 }
038 }
039 }
040
041 /**
042 * Gibt n über k zurück, falls 0 <= k <= n ist.
043 * Ansonsten wird -1 zurückgegeben.
044 *
045 * @param n grösser gleich 0
046 * @param k k <= n
047 */
048 public int getNUeberK(int n, int k) {
049
050 if (n < 0 || n < k) {
051 return -1;
052 }
053
054 if ( n >= pascalscheDreieck.length) {
055 pascalscheDreieck = new int[2*n+1][2*n+1];
056 pascalscheDreieckBerechnen();
057 }
058
059 return pascalscheDreieck[n][k];
060 }
061
062 /**
063 * Setzt den Wert von n über k auf
064 * <code>nUeberK</code>.
065 *
066 * @param n n >= 0
067 * @param k 0 <= k <= n
068 * @param nUeberK der Binomialkoeffizient von n über k
069 */
070 private void setNUeberK(int n, int k, int nUeberK) {
071 pascalscheDreieck[n][k] = nUeberK;
072 }
073 }