enkryptor

Untitled

Jan 12th, 2023
999
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function sostavChisla(numbers, target) {
  2.     const sum = arr => arr.reduce((a, b) => a + b); // сложение чисел в массиве
  3.     const predicate = value => sum(value) === target; // условие
  4.     const empty = arr => !arr?.length; // проверка на пустой массив
  5.  
  6.     // Генерируем комбинации:
  7.     //  в head принимаем базовую комбинацию (может быть пустой)
  8.     //  в tail принимает значения, комбинации с которыми надо достроить к head
  9.     // функция стартует с пустым head и с массивом в tail, в итоге строит все комбинации из значений этого массива
  10.     const combinations = function(head, tail, result) {
  11.         if (empty(head) && empty(tail))
  12.             // терминальное условие выхода из рекурсии
  13.             return;
  14.  
  15.         if (empty(tail)) {
  16.             // в хвосте ничего не осталось — значит это готовая комбинация
  17.             if (predicate(head)) {
  18.                 // добавим её к результатам, если она удовлетворяет условию
  19.                 result.push(head);
  20.             }
  21.         } else {
  22.             // Иначе рекурсивно вызываем себя же но для уменьшенного списка значений, и так пока он не кончится.
  23.             // Уменьшаем хвост на одно значение, и повторяем всё то же самое для комбинации с этим значением и без него.
  24.             // Вызов функции будет мутировать массив result (добавит в него подходящие комбинации).
  25.             combinations([...head, tail[0]], tail.slice(1), result);
  26.             combinations([...head], tail.slice(1), result);
  27.         }
  28.         return result;
  29.     }
  30.     return combinations([], numbers, []);
  31. }
  32.  
  33. console.log(sostavChisla([1, 2, 3, 4, 5, 6, 7, 8], 8));
Advertisement
Add Comment
Please, Sign In to add comment