private double getCostOfNGramRecursive(String[] s, int smoothing) {
        double value = 0;
        switch (smoothing) {
            case STUPID_BACKOFF: //From http://stackoverflow.com/questions/16383194/stupid-backoff-implementation-clarification
                if(s.length>1) {
                    value = counts(s);
                    String argument[] = new String[s.length-1];
                    System.arraycopy(s, 1, argument, 0, argument.length);
                    if(value>0) {
                        value /= counts(argument);
                    } else {
                        value = STUPID_BACKOFF_ALPHA*getCostOfNGramRecursive(argument, STUPID_BACKOFF);
                    }
                } else { //This is only "valid" because we will have a small corpus
                    double counts = STUPID_BACKOFF_BASE;
                    if(s.length>0) {
                        counts=counts(s);
                    }
                    if(counts==0) {
                        counts=STUPID_BACKOFF_BASE;
                    }
                    double total = ngram[0].numberOfGrams();
                    value = counts/total;
                }
                break;
            case JELINEK_MERCER: //From http://nlp.stanford.edu/~wcmac/papers/20050421-smoothing-tutorial.pdf

                break;
            default:
                throw new IllegalArgumentException();
        }
        return value;
    }