Sie haben eine Funktion entwickelt, die Elemente aus einem Array zufällig auswählt und so sicherstellt, dass aktuelle Auswahlen nicht wiederholt werden. Obwohl die aktuelle Lösung effektiv funktioniert, haben Sie Bedenken hinsichtlich ihrer Effizienz und ob sie zu übermäßiger Schleifenbildung führen könnte. Lassen Sie uns einen effizienteren Ansatz erkunden.
1. Überlegungen zur Rekursion
Ja, Ihre Funktion „selectName()“ kann als rekursiv betrachtet werden, da sie sich selbst aufruft, bis sie einen eindeutigen Namen findet. Rekursion kann für bestimmte Probleme nützlich sein, aber es ist wichtig, die Stapelnutzung und die Möglichkeit einer übermäßigen Tiefe im Auge zu behalten.
2. Eine effiziente Lösung
Um Effizienzbedenken auszuräumen, können wir eine andere Strategie verfolgen. Anstatt uns auf Rekursion und Schleifen zu verlassen, bis ein eindeutiger Name gefunden wird, können wir eine Kopie des ursprünglichen Arrays erstellen und zufällig Elemente aus der Kopie auswählen, bis alle Elemente ausgewählt sind. Sobald alle Elemente erschöpft sind, setzen wir die Kopie auf ihren ursprünglichen Zustand zurück.
Hier ist eine JavaScript-Implementierung dieses Ansatzes:
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.
Dieser Ansatz nutzt die Array-Slice()-Methode von JavaScript, um eine flache Kopie des ursprünglichen Arrays zu erstellen. Anschließend wählt es wiederholt zufällige Elemente aus der Kopie aus und entfernt sie aus der Kopie, wodurch effektiv eine zufällige Auswahl ohne Wiederholungen nachgeahmt wird, bis alle Elemente erschöpft sind. Sobald alle Elemente ausgewählt sind, wird die Kopie zurückgesetzt, sodass die zufällige Auswahl erneut beginnen kann.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3