я бы подойти к нему так:
Первое, обобщать проблему. Вы можете определить функцию
printPartitions(int target, int maxValue, string suffix)
со спецификацией:
печати все целые разделы мишени, а затем суффикса, таким образом, что каждое значение в перегородке не более 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
+1 для описания пациента int подробно. –