Выведите все возможные строки в JS - PullRequest
1 голос
/ 12 июля 2020

Я хочу создать функцию, которая печатает все возможные комбинации из данной строки. пример: given_string = "AB C" это должно напечатать: AAA AAB AAC ABA ABB ABC .. и так далее, пока не будет достигнуто максимальное количество вариантов. CCC

Я нашел код в Интернете и изменил его на JS

s = ["A", "B", "C"]

function printAllKLength(set, k) {
  n = set.length;
  printAllKLengthRec(set, "", n, k);
}

function printAllKLengthRec(set, prefix, n, k) {
  if (k == 0) {
    console.log(prefix);
    return;
  }
  for (i = 0; i < n; i++) {
    newPrefix = prefix + set[i];
    printAllKLengthRec(set, newPrefix, n, k - 1);
  }
}
printAllKLength(s, 4)

Он меняет только последний символ, и я не понимаю, в чем моя ошибка. URL исходного кода: https://www.geeksforgeeks.org/print-all-combinations-of-given-length/

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

При объявлении переменных вы упустили использование ключевого слова var и особенно перед объявлением i в операторе for. Это важно, поскольку переменные без ключевого слова var определены в глобальной области , и каждый рекурсивный вызов использует одну и ту же переменную i для for l oop. Вот почему у него очень мало возможностей. См. Фиксированный код ниже:

s = ["A", "B", "C"]

function printAllKLength(set, k) {
  n = set.length;
  printAllKLengthRec(set, "", n, k);
}

function printAllKLengthRec(set, prefix, n, k) {
  if (k == 0) {
    console.log(prefix);
    return;
  }
  for (var i = 0; i < n; i++) {
    // ^^^ Notice var, it scopes the variable to the function otherwise, it will be global 
    newPrefix = prefix + set[i];
    printAllKLengthRec(set, newPrefix, n, k - 1);
  }
}
printAllKLength(s, 4)
0 голосов
/ 13 июля 2020

Другой ответ уже продемонстрировал, как исправить ваш код. Но я просто хочу указать на более простую рекурсию для вычисления этих значений, оставив печать для отдельного шага:

const allCombos = (n, xs) =>
  n == 0
    ? ['']
    : allCombos (n - 1, xs) .flatMap (c => xs. map(x => c + x))

console .log (
  allCombos (3, ['A', 'B', 'C']),
)
.as-console-wrapper {min-height: 100% !important; top: 0}

Для n -символьных строк мы просто повторяем n - 1 символов, и для каждого из них сопоставляем символы, добавляя каждый к строка. Когда n равно 0, мы просто возвращаем массив, содержащий пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...