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    }