Je rencontre un problème lors du codage. Je veux compter le nombre de lettres d'un mot qui se répètent récursivement. Mon code ressemble à ceci:

var check = words[0]

  if(!words){
     return 0
  } else {
     for(var i = 0; i < words.length; i++){
        if(words[i] == check){
           return 1 //+ countDuplicate (words.slice(1))
        }
     }
     return countDuplicate (words.slice(1))
  }

Exemple pour cas de test:

countDuplicate ('greatestme') // 2, ==> which are 'e' 3 times and 't' 2 times
0
Andy Warhol 26 janv. 2019 à 21:34

3 réponses

Meilleure réponse
/* Method 1 */
function countDuplicate1(word) {
  var arr = word.split("").reduce((acc, cv) => {
    if(!acc[cv]) {
      acc[cv] = 1;
    } else {
      acc[cv]++;
    }
    return acc;
  }, {});
  return Object.values(arr).filter(val => val >1).length;
}

/* Method 2 */
function countDuplicate2(word) {
  var arr = [];
  for(var i=0; i< word.length; i++) {
    var chr = word[i];
    for(var j=i+1; j< word.length; j++) {
      if((word[j] == chr) && !arr.includes(word[j])) {
        arr.push(word[j]);
      }
    }
  }
  return arr.length;
}
var count1 = countDuplicate1('greatestme');
var count2 = countDuplicate2('greatestme');
console.log(count1);
console.log(count2);

Voyez si cela aide.

1
Abhishek 26 janv. 2019 à 21:06

Ce problème n'est pas vraiment un bon candidat pour la récursivité, mais une façon de le faire est de maintenir deux ensembles:

  • l'ensemble des caractères qui ne se sont produits qu'une seule fois
  • l'ensemble des caractères qui se sont produits plus d'une fois

Lors du traitement du personnage suivant, vous devez décider comment ces deux ensembles doivent être modifiés. Lorsque tous les caractères sont traités, vous retournez la taille du deuxième ensemble.

Les deux ensembles sont initialisés comme des ensembles vides:

function countDuplicate(word, once = new Set, more = new Set) {
    var check = word[0];
    if (!check) return more.size;
    if (once.delete(check)) { // If successful, it was present
        more.add(check);
    } else {
        once.add(check);
    }
    return countDuplicate(word.slice(1), once, more);
}

const result = countDuplicate ('greatestme');

console.log(result);
0
trincot 26 janv. 2019 à 20:27
const freqDist = ([first, ...rest], counts = {}) => (result => (
  rest.length ? freqDist(rest, result) : result
))({ ...counts, [first]: ((counts[first] || 0) + 1) })

/* More readable alternative with mutable `counts` */
// const freqDist = ([first, ...rest], counts = {}) => {
//   counts[first] = (counts[first] || 0) + 1
//   return (rest.length > 0) ? freqDist(rest, counts) : counts
// }

const stripSingles = obj => Object.keys(obj).reduce((acc, curr) => (
  (obj[curr] > 1) ? { ...acc, [curr]: obj[curr] } : acc
), {})

console.log(stripSingles(freqDist('greatestme')))
1
kornieff 29 janv. 2019 à 17:10