Получение подмножества функциональным способом

avatar
Adam Morad
8 апреля 2018 в 08:33
67
2
2

Мне нужно реализовать функцию, которая получает массив A из n элементов и число k в качестве входных данных и возвращает массив со всеми подмножествами размера k числа A (каждое подмножество будет само массивом).

Определите тип функции и выполните как минимум 3 теста для функции (используя утверждение). Он должен быть написан на Javascript/Typescript и иметь функционал

.

Например: FunSubsets ([1,2,3],2) => [[1,2],[1,3],[2,3]]

Есть идеи?

Источник

Ответы (2)

avatar
Nina Scholz
8 апреля 2018 в 09:14
2

Вы можете использовать функцию генератора с еще одним параметром для временного набора результатов.

function* subsets(values, size, parts = []) {
    var i;

    size--;
    for (i = 0; i < values.length; i++) {
        if (size) {
            yield* subsets(values.slice(i + 1), size, [...parts, values[i]]);
        } else {
            yield [...parts, values[i]];
        }
    }
}

console.log([...subsets([1, 2, 3], 2)]);
console.log([...subsets([1, 2, 3, 4, 5], 2)]);
.as-console-wrapper { max-height: 100% !important; top: 0; }
avatar
Taki
8 апреля 2018 в 09:07
1

цикл по массиву, и для каждого элемента вы снова создаете цикл, чтобы создать срез длиной k - 1, который вы объединяете с текущим элементом первого цикла, и вы помещаете его во временный массив, который вы возвращаете в конце.

let myArr = [1, 2, 3, 4];

let k = 2;

function subSet(arr, k) {

  let tmpArr = [];
  for (var i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      let slice = arr.slice(j, j + k - 1);
      slice.push(arr[i]);
      tmpArr.push(slice.reverse());
    }
  }
  return tmpArr;
}

let mySubSets = subSet(myArr, k);

console.log(JSON.stringify(mySubSets));