Помогите с пониманием задания. Функция для перебора всех возможных представлений натурального числа N
Смог сделать таск, но не совсем понял ,что от меня требуется.
Таск: Создайте функцию для перебора всех возможных представлений натурального числа N в виде суммы других натуральных чисел. Для универсальности будем передавать в функцию другую функцию (а точнее функциональный интерфейс), которая будет использоваться в качестве callback-вызова, который будет вызываться для каждого варианта представления натурального числа N в виде суммы других натуральных чисел. Функция должна иметь следующую сигнатуру:
public static void genAll(int k, Consumer<List<Integer>> callback)
И вызываться будет как-то так:
genAll(10, (List<Integer> next) -> {
// например, распечатка очередного варианта представления
// в виде суммы чисел из списка next
...
});
Вот мой код для подбора всех комбинаций сумм числа(сначала просто сделал , а потом попытался припихнуть в код встроенный функциональный интерфейс consumer , но мне кажется должно получиться не совсем то , что у меня):
import java.util.List;
import java.util.Scanner;
import java.util.function.Consumer;
public class Task12 {
public static void main(String[] args) {
myClass object = new myClass();
object.print();
}
static class myClass {
int a = 1;
int b = 1;
public void genAll(int k, Consumer<List<Integer>> callback) {
for (int i = 1; i < k; i++) {
System.out.print(a);
for (int j = k - i; j > 1; j--) {
System.out.print(" + 1");
}
System.out.println(" + " + b);
b++;
}
b = a + 1;
a++;
if (k > 1){
genAll(k - 2, callback);
}
}
public void print(){
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
genAll(x, (List<Integer> next) -> {
});
}
}
}
Вывод для 4 :
1 + 1 + 1 + 1
1 + 1 + 2
1 + 3
2 + 2
Ответы (1 шт):
В вашем решении переменная callback никак не используется. Вы просто пробрасываете ее рекурсивно и все. Если ее убрать, то ничего не изменится. А вместе с тем именно она должна управлять данными, которые будут получены в результате работы метода genAll(). А результатом работы данного метода должен быть не вывод в консоль, как у вас, а получение коллекции List, работой которой и будет управлять callback. В этом идея задачи.
Для того, чтобы адаптировать ваше решение под задачу, нужно сделать примерно так:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.stream.Collectors;
public class Task12 {
private static Scanner SCANNER = new Scanner(System.in);
private int a = 1;
private int b = 1;
public static void main(String[] args) {
new Task12().genAll(SCANNER.nextInt(), next -> {
String result = next.stream().map(String::valueOf).collect(Collectors.joining(" + "));
System.out.println(result);
});
}
public void genAll(int k, Consumer<List<Integer>> callback) {
List<Integer> list = new ArrayList<>();
for (int i = 1; i < k; i++) {
list.add(a);
for (int j = k - i; j > 1; j--) list.add(1);
list.add(b++);
callback.accept(list);
list.clear();
}
b = 1 + a++;
if (k > 1) genAll(k - 2, callback);
}
}
А теперь попробуйте переписать вызов метода так:
public static void main(String[] args) {
int x = SCANNER.nextInt();
new Task12().genAll(x, next -> {
String result = next.stream().map(String::valueOf).collect(Collectors.joining(", ", "", "; sum is " + x));
System.out.println(result);
});
}
Или, к примеру, так:
public static void main(String[] args) {
int x = SCANNER.nextInt();
new Task12().genAll(x, next -> {
Integer result = next.stream().mapToInt(Integer::intValue).sum();
if (result == x) System.out.println("Correct result : " + result);
else System.out.println("Incorrect result : " + result);
});
}
Вы увидите, что вывод в консоли отличается.Таким образом, я фактически управляю коллекцией List с помощью callback, в данном конкретном случае меняю формат вывода в консоль