Биномический коэффициент с использованием метода памятки

Я написал функцию, которая рекурсивно вычисляет член биномиального коэффициента n и k, используя метод Memoizazion, я получаю OutOfBoundException когда я выполню, я буду рад услышать некоторые указания об ошибке, которую я сделал. Спасибо вам всем.

public class Binomial {

    public static void main(String[] args) {

        int n = Integer.parseInt(args[0]);
        int k = Integer.parseInt(args[1]);
        StdOut.print(binomial(n, k));
    }

    /**
     * Recursively calculates the binomical coefficient term of n and k using
     * the memoizazion methood
     *
     * @param n
     *            the upper nonnegative integer of the binomical coefficient
     * @param k
     *            the lower nonnegative integer of the binomical coefficient
     * @returns the computed binomical coefficient
     */
    public static long binomial(int n, int k) {
        long[][] mem = new long[n + 1][k + 1];
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= n; j++) {
                mem[i][j] = -1;
            }
        }
        return binomial(n, k, mem);
    }

    public static long binomial(int n, int k, long[][] mem) {
        if (k > n)
            return 0;
        if (k == 0 || n == 0)
            return 1;
        if (mem[n - 1][k] == -1) {
            mem[n - 1][k] = binomial(n - 1, k, mem);
        }
        if (mem[n - 1][k - 1] == -1) {
            mem[n - 1][k - 1] = binomial(n - 1, k - 1, mem);
        }
        return (mem[n - 1][k] + mem[n - 1][k - 1]);
    }
}

1 ответ

Очень простая ошибка вызывает эту ошибку в функции public static long binomial(int n, int k) менять n во внутреннем for с k, Я имею в виду:

public static long binomial(int n, int k) {
    long[][] mem = new long[n + 1][k + 1];
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= k; j++) {
            mem[i][j] = -1;
        }
    }
    return binomial(n, k, mem);
}

ваша правильная функция.

Другие вопросы по тегам