считать повторяющиеся значения в рекурсии - PullRequest
0 голосов
/ 28 января 2019

как посчитать повторяющиеся значения в строке / массиве по рекурсии, хорошо, я знаю, как найти дубликат и уникальность по циклу с объектом, но в этом случае я попытался рекурсировать его, чтобы изучить мою логику, вотчто я пробовал

function duplicate(word) {
  let [obj, arr, count ] = [{},[],0]
  for (i of word) {
    obj[i] = (obj[i] || 0) + 1

    if (obj[i] == 2) {
      arr.push(i);
    }
  }

  // console.log(arr);
  let words = [...word];
  words = [...new Set(words)];
  // // return word
  if (words.length === 0) {
    return count
  } else if (arr.includes(words[0])) {
    count++
  }
    return count + duplicate(words.slice(1))

}


console.log(duplicate('xmikemk')) // 2

я пытался создать объект кулак и пустоту для newArr, если значения найдены 2 раза, затем я попытался снова установить слово ниже, чтобы просто показать уникальное значение, затемя рекурсирую это, когда я консоль регистрирую это, метод slice на том ниже к рекурсии и не работает, поэтому результат, который я получил здесь, равен 0, что не так с моим кодом?я не прав с этим условием ??

это переменное слово имеет = ('xmikemk') which has 2 duplicate words, m and k , so the output i want is 2`

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вы делаете это более сложным, чем оно есть.Просто создайте метод внутреннего аккумулятора, чтобы заполнить карту и увеличить частоту.

function duplicate(word) {
  return duplicateInternal(word, {});
}

function duplicateInternal(word, mapping) {
  if (word == null || word.length === 0) {
    return mapping;
  }
  var c = word.charAt(0);
  mapping[c] = (mapping[c] || 0) + 1;
  return duplicateInternal(word.substr(1), mapping);
}

var mapping = duplicate('xmikemk');
var frequency = Object.keys(mapping)
  .map(key => [key, mapping[key]])
  .sort((a, b) => {
    let diff = -1 * (a[1] - b[1]);
    return diff === 0 ? a[0].localeCompare(b[0]) : diff;
  });

console.log(frequency.map(x => x.join(' x')).join('\n'))
.as-console-wrapper {
  top: 0;
  max-height: 100% !important;
}
0 голосов
/ 28 января 2019

Вы можете распространить данную строку и взять только первый символ для подсчета, приняв другой параметр для передачи последних подсчитанных значений.

Если больше нет расширяемых элементов, подсчет производится и возвращается.В противном случае продолжайте рекурсивный вызов.

function duplicate([w, ...rest], counter = {}) {
    counter[w] = (counter[w] || 0) + 1;
    if (!rest.length) {
        return Object.values(counter).reduce((s, c) => s + (c > 1), 0);
    }
    return duplicate(rest, counter);
}

console.log(duplicate('xmikemk')) // 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...