我会这样处理:
首先,概括问题。你可以定义一个函数
printPartitions(int target, int maxValue, string suffix)
与规范:
打印target的所有整数分区,后跟后缀,使得分区中的每个值最多为maxValue
请注意,始终存在至少 1 个解(假设 target 和 maxValue 均为正数),即全为 1。
您可以递归地使用此方法。因此,让我们首先考虑基本情况:
printPartitions(0, maxValue, suffix)
应该简单地打印suffix
.
如果target
不是0
,您必须选择:使用maxValue
或不使用(如果maxValue > target
只有一个选项:不要使用它)。如果你不使用它,你应该maxValue
降低1
.
那是:
if (maxValue <= target)
printPartitions(target-maxValue, maxValue, maxValue + suffix);
if (maxValue > 1)
printPartitions(target, maxValue-1, suffix);
将这一切结合起来会产生一个相对简单的方法(此处用 Java 编码,我对语句进行了一些重新排序以获得与您描述的完全相同的顺序):
void printPartitions(int target, int maxValue, String suffix) {
if (target == 0)
System.out.println(suffix);
else {
if (maxValue > 1)
printPartitions(target, maxValue-1, suffix);
if (maxValue <= target)
printPartitions(target-maxValue, maxValue, maxValue + " " + suffix);
}
}
您可以简单地将其称为
printPartitions(4, 4, "");
哪个输出
1 1 1 1
1 1 2
2 2
1 3
4
您还可以选择先创建所有解决方案的列表,然后再打印,如下所示:
function createPartitions(target, maxValue, suffix, partitions) {
if (target == 0) {
partitions.push(suffix);
} else {
if (maxValue > 1)
createPartitions(target, maxValue-1, suffix, partitions);
if (maxValue <= target)
createPartitions(target-maxValue, maxValue, [maxValue, ...suffix], partitions);
}
}
const partitions = [];
createPartitions(4, 4, [], partitions);
console.log(partitions);