Я работаю над проектом кодирования, и у меня проблема со скоростью программы. Программа принимает вход между 1 и 80, этот вход представляет собой ряд совпадений, и выводит, сколько разных чисел можно сделать с таким количеством совпадений.Эффект рекурсивного алгоритма - Java
Ex: Номер 1 может быть выполнен с 2 спичечных палочками, а число 2 требует 5 матча палочку
Вот полное приглашение программы:
Вот мой код к алгоритму, который я придумал для вычисления всего возможного выхода, он функционирует достаточно хорошо для нижнего конца входов, хотя он становится крайне неэффективным для больших входов, таких как 80 часов, чтобы вычислить все возможности. Как я могу сократить это время до минимума?
п представляет вход, и все объектные счетчик делает это следить за каждым возможным количеством созданного
public static void digitCounter(int n, Counter count) {
if (n < 2) {
//ouput
} else {
if (count.getCount() == 0) {
// If there are enough match sticks to form it
// accounts for 0 only once
if (n >= 7) {
// counts 0
count.setCount(10);
// counts 1
digitCounter(n - 2, count);
// counts 2
digitCounter(n - 5, count);
// counts 3
digitCounter(n - 5, count);
// count 4
digitCounter(n - 4, count);
// counts 5
digitCounter(n - 5, count);
// counts 6
digitCounter(n - 6, count);
// counts 7
digitCounter(n - 3, count);
// counts 8
digitCounter(n - 7, count);
// counts 9
digitCounter(n - 5, count);
} else if (n == 6) {
count.setCount(9);
digitCounter(n - 2, count);
digitCounter(n - 5, count);
digitCounter(n - 5, count);
digitCounter(n - 4, count);
digitCounter(n - 5, count);
digitCounter(n - 6, count);
digitCounter(n - 3, count);
digitCounter(n - 5, count);
} else if (n == 5) {
count.setCount(7);
digitCounter(n - 2, count);
digitCounter(n - 5, count);
digitCounter(n - 5, count);
digitCounter(n - 4, count);
digitCounter(n - 5, count);
digitCounter(n - 3, count);
digitCounter(n - 5, count);
} else if (n == 4) {
count.setCount(3);
digitCounter(n - 2, count);
digitCounter(n - 4, count);
digitCounter(n - 3, count);
} else if (n == 3) {
count.setCount(2);
digitCounter(n - 2, count);
digitCounter(n - 3, count);
} else if (n == 2) {
count.setCount(1);
digitCounter(n - 2, count);
}
}
// Accounts for every other number after 0 is accounted for so
// numbers with leading 0's are not formed
// Ex: 001 is illegal
else {
if (n >= 7) {
count.setCount(count.getCount() + 10);
digitCounter(n - 6, count);
digitCounter(n - 2, count);
digitCounter(n - 5, count);
digitCounter(n - 5, count);
digitCounter(n - 4, count);
digitCounter(n - 5, count);
digitCounter(n - 6, count);
digitCounter(n - 3, count);
digitCounter(n - 7, count);
digitCounter(n - 5, count);
} else if (n == 6) {
count.setCount(count.getCount() + 9);
digitCounter(n - 6, count);
digitCounter(n - 2, count);
digitCounter(n - 5, count);
digitCounter(n - 5, count);
digitCounter(n - 4, count);
digitCounter(n - 5, count);
digitCounter(n - 6, count);
digitCounter(n - 3, count);
digitCounter(n - 5, count);
} else if (n == 5) {
count.setCount(count.getCount() + 7);
digitCounter(n - 2, count);
digitCounter(n - 5, count);
digitCounter(n - 5, count);
digitCounter(n - 4, count);
digitCounter(n - 5, count);
digitCounter(n - 3, count);
digitCounter(n - 5, count);
} else if (n == 4) {
count.setCount(count.getCount() + 3);
digitCounter(n - 2, count);
digitCounter(n - 4, count);
digitCounter(n - 3, count);
} else if (n == 3) {
count.setCount(count.getCount() + 2);
digitCounter(n - 2, count);
digitCounter(n - 3, count);
} else if (n == 2) {
count.setCount(count.getCount() + 1);
digitCounter(n - 2, count);
}
}
}
Так много из ваших случаев вызывают 'digitCounter (n-5, count)' несколько раз. Ожидаете ли вы, что результат будет другим, второй, третий или четвертый раз, когда вы его назовете? – pamphlet
Кроме того, я не понимаю, почему вы используете 'count' вместо возвращаемого значения. – pamphlet
Благодарим вас за то, что нашли время, чтобы решить вашу проблему, прежде чем приступить к StackOverflow. – Ivan