【发布时间】:2014-01-23 15:55:47
【问题描述】:
我正在处理一个编码项目,但我遇到了程序速度问题。程序接受一个介于 1 到 80 之间的输入,这个输入代表一根火柴棒的数量,并输出用这个数量的火柴棒可以组成多少个不同的数字。
例如:数字 1 可以用 2 根火柴组成,数字 2 需要 5 根火柴
这是程序的完整提示:
这是我想出的用于计算所有可能结果的算法的代码,它在输入的低端运行得相当好,尽管它对于大型输入(例如需要花费数小时计算所有结果的 80 小时)变得非常低效可能性。我怎样才能将这个时间减少到最少?
n 表示输入,Counter 对象所做的只是跟踪创建的每个可能的数字
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)。您是否希望第二次、第三次或第四次调用结果会有所不同? -
另外,我不明白你为什么使用
count而不是返回值。 -
感谢您在来到 StackOverflow 之前花时间解决自己的问题。
-
感谢大家的帮助!
标签: java algorithm recursion performance