Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function sostavChisla(numbers, target) {
- const sum = arr => arr.reduce((a, b) => a + b); // сложение чисел в массиве
- const predicate = value => sum(value) === target; // условие
- const empty = arr => !arr?.length; // проверка на пустой массив
- // Генерируем комбинации:
- // в head принимаем базовую комбинацию (может быть пустой)
- // в tail принимает значения, комбинации с которыми надо достроить к head
- // функция стартует с пустым head и с массивом в tail, в итоге строит все комбинации из значений этого массива
- const combinations = function(head, tail, result) {
- if (empty(head) && empty(tail))
- // терминальное условие выхода из рекурсии
- return;
- if (empty(tail)) {
- // в хвосте ничего не осталось — значит это готовая комбинация
- if (predicate(head)) {
- // добавим её к результатам, если она удовлетворяет условию
- result.push(head);
- }
- } else {
- // Иначе рекурсивно вызываем себя же но для уменьшенного списка значений, и так пока он не кончится.
- // Уменьшаем хвост на одно значение, и повторяем всё то же самое для комбинации с этим значением и без него.
- // Вызов функции будет мутировать массив result (добавит в него подходящие комбинации).
- combinations([...head, tail[0]], tail.slice(1), result);
- combinations([...head], tail.slice(1), result);
- }
- return result;
- }
- return combinations([], numbers, []);
- }
- console.log(sostavChisla([1, 2, 3, 4, 5, 6, 7, 8], 8));
Advertisement
Add Comment
Please, Sign In to add comment