web-dev-qa-db-fra.com

Imprimer récursivement toutes les permutations d'une chaîne (Javascript)

J'ai vu des versions de cette question pour d'autres langues, mais pas pour JS.

Est-il possible de faire cela de manière récursive dans une fonction?

Je comprends que je dois prendre le premier élément de la chaîne, puis l’ajouter à chaque solution à la récursion sur le reste de la chaîne. Donc, logiquement, je comprends comment la récursivité doit aller. Je ne comprends tout simplement pas comment ajouter le premier caractère à chacune des solutions récursives

var myString = "xyz";

function printPermut(inputString){
    var outputString;
    if(inputString.length === 0){
        return inputString;
    }
    if(inputString.length === 1){
        return inputString;
    }
    else{
       for(int i = 0; i<inputString.length(); i++){
           //something here like: 
           //outputString = outputString.concat(printPermut(inputString.slice(1))??
           //maybe store each unique permutation to an array or something?
       } 
    }
}
26
singmotor

Ecrivons une fonction qui renvoie toutes les permutations d'une chaîne sous forme de tableau. Comme vous ne voulez pas de variables globales, il est crucial de renvoyer les permutations.

function permut(string) {
    if (string.length < 2) return string; // This is our break condition

    var permutations = []; // This array will hold our permutations

    for (var i=0; i<string.length; i++) {
        var char = string[i];

        // Cause we don't want any duplicates:
        if (string.indexOf(char) != i) // if char was used already
            continue;           // skip it this time

        var remainingString = string.slice(0,i) + string.slice(i+1,string.length); //Note: you can concat Strings via '+' in JS

        for (var subPermutation of permut(remainingString))
            permutations.Push(char + subPermutation)

    }
    return permutations;
}

Pour les imprimer, il suffit de parcourir le tableau par la suite:

var myString = "xyz";
permutations = permut(myString);
for (permutation of permutations)
    print(permutation) //Use the output method of your choice

J'espère que je pourrais vous aider avec votre question.

57
Syntac

Le problème des permutations a été étudié à mort. algorithme de Heap est une solution bien connue. Voici une version en JS, utilisant un générateur:

function *permute(a, n = a.length) {
  if (n <= 1) yield a.slice();
  else for (let i = 0; i < n; i++) {
    yield *permute(a, n - 1);
    const j = n % 2 ? 0 : i;
    [a[n-1], a[j]] = [a[j], a[n-1]];
  }
}

console.log(Array.from(permute("abcabad".split('')))
.map(perm => perm.join(''))
.filter((el, idx, self) => (self.indexOf(el) === idx)));

permute est conçu pour prendre et générer des tableaux, et non des chaînes. Nous avons donc scindé la chaîne en caractères avant de l'appeler, puis nous avons réinséré les caractères dans les chaînes avant d'imprimer les résultats.

40
user663031

Utilisez Fonction récursive pour parcourir la chaîne

    

    function getPermutations(string) {
      var results = [];

      if (string.length === 1) 
      {
        results.Push(string);
        return results;
      }

      for (var i = 0; i < string.length; i++) 
      {
        var firstChar = string[i];
        var otherChar = string.substring(0, i) + string.substring(i + 1);
        var otherPermutations = getPermutations(otherChar);
        
        for (var j = 0; j < otherPermutations.length; j++) {
          results.Push(firstChar + otherPermutations[j]);
        }
      }
      return results;
    }
    
    var permutation = getPermutations('YES').filter((el, idx, self) => (self.indexOf(el) === idx));
    console.log("Total permutation: "+permutation.length);
    console.log(permutation);
3
Nikhil Mahirrao

Sujet semi-off:

la permutation aléatoire d'une chaîne donnée est aussi simple que rndperm:

i = document.getElementById("Word");
b = document.getElementById("butt");

rndperm = (z) => {
  return z.split("").sort(() => ((Math.random() * 3) >> 0) - 1).join("")
}

function scramble() {
  i.value = rndperm(i.value);
}

var z;

function sci() {
  if (z != undefined) {
    clearInterval(z);
    b.innerText = "Scramble";
    z=undefined;
  } else {
    z = setInterval(scramble, 100);
    b.innerText = "Running...";
  }
}
<center><input id="Word" value="HelloWorld"></input><button id="butt" onclick=sci()>Scramble</button></center>
0
Zibri