Vous avez conçu une fonction qui sélectionne aléatoirement les éléments d'un tableau, garantissant que les sélections récentes ne sont pas répétées. Bien que la solution actuelle fonctionne efficacement, vous avez des inquiétudes quant à son efficacité et si elle pourrait conduire à un bouclage excessif. Explorons une approche plus efficace.
1. Considérations sur la récursion
Oui, votre fonction ChooseName() peut être considérée comme récursive car elle s'appelle jusqu'à ce qu'elle trouve un nom unique. La récursivité peut être utile pour certains problèmes, mais il est important d'être conscient de l'utilisation de la pile et du potentiel de profondeur excessive.
2. Une solution efficace
Pour répondre aux problèmes d'efficacité, nous pouvons adopter une stratégie différente. Au lieu de compter sur la récursion et la boucle jusqu'à ce qu'un nom unique soit trouvé, nous pouvons créer une copie du tableau d'origine et sélectionner aléatoirement des éléments de la copie jusqu'à ce que tous les éléments soient sélectionnés. Une fois tous les éléments épuisés, nous réinitialisons la copie à son état d'origine.
Voici une implémentation JavaScript de cette approche :
function randomNoRepeats(array) {
var copy = array.slice(0);
return function() {
if (copy.length "Bar"
console.log(chooser()); // => "Foo"
console.log(chooser()); // => "Gah"
console.log(chooser()); // => "Foo" -- only repeats once all items are exhausted.
Cette approche utilise la méthode array slice() de JavaScript pour créer une copie superficielle du tableau d'origine. Il sélectionne ensuite à plusieurs reprises des éléments aléatoires de la copie et les supprime de la copie, imitant efficacement une sélection aléatoire sans répétition jusqu'à ce que tous les éléments soient épuisés. Une fois tous les éléments sélectionnés, la copie est réinitialisée, permettant à la sélection aléatoire de recommencer.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3