Java-приложение для нахождения перестановок эффективно


Я восьмиклассник со школьным проектом создания и применения на языке Java, который возвращает общее количество перестановок из двух заданных чисел. Он должен быть легким и эффективным, для дальнейшего развертывания на веб-сайте. Мне было интересно, если есть способ я могу улучшить код таким образом, было бы более эффективным.

class Factorials {
    public static void main(String[] args){
        int n = 8;
        long factorialN = n;
        for (int ForN = n; ForN <= n && ForN > 1; ForN--) {
            factorialN = factorialN * ForN;
        }
        factorialN = factorialN / n;
        System.out.println(factorialN);

        int r = 6;
        int rMinus1 = r - 1;
        long factorialR = rMinus1;
        for (int ForR = rMinus1; ForR <= rMinus1 && ForR > 1; ForR--) {
            factorialR = factorialR * ForR;
        }
        factorialR = factorialR / rMinus1;
        System.out.println(factorialR);

        int nMr = n - r;
        System.out.println(nMr);
        long factorialNmR = nMr;
        if (nMr == 2) {
            factorialNmR = 2;
        }
        else if (nMr <= 1){
            factorialNmR = 1;
        }
        else if (nMr > 2) {
            for (int FornMr = nMr; FornMr <= nMr && FornMr > 1; FornMr--) {
                factorialNmR = factorialNmR * FornMr;
            }
            factorialNmR = factorialNmR / nMr;
            System.out.println(factorialNmR);
        }

        long permutations = factorialN;
        System.out.println(permutations);
        permutations = permutations / factorialNmR;
        System.out.println(permutations);
    }
}


Комментарии
1 ответ

Во-первых, пожалуйста, напишите одну функцию вместо расширения, по сути, один и тот же код три раза!

long factorialN = n;
for (int ForN = n; ForN <= n && ForN > 1; ForN--) {
factorialN = factorialN * ForN;
}
factorialN = factorialN / n;

Кроме того, если к-счетчик цикла начнется в Н И только декремент, вам не нужно проверять на каждой итерации, будет ли он меньше или равен N; это гарантированно. Вам нужно только проверить, если это больше чем 1. Но это не приводит к снижению производительности, поскольку Java-компилятор достаточно умен, чтобы игнорировать лишние проверки.

Теперь, если вы хотите быстрее факториала реализации, вы можете использовать рекурсивный, как описано в этом разделе. Это в C#, но вы должны иметь никаких проблем преобразовать его в Java. Единственное, вам нужно получить знания о том, что рекурсия действительно, прежде чем пытаться пройти этот кусок кода, Вы понимаете.

Или, вы могли бы использовать что-то намного более развитой, как асимптотическое разложение на простые множители алгоритм, описанный на этой странице, но вы будете иметь очень трудное время убедить своего учителя, что ты, ученика 8-го класса, имеют ни малейшего понятия о том, как этот алгоритм работает и почему, так что лучше держитесь от него подальше!

6
ответ дан 19 декабря 2011 в 03:12 Источник Поделиться