Помогите с пониманием задания. Функция для перебора всех возможных представлений натурального числа 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, в данном конкретном случае меняю формат вывода в консоль

→ Ссылка