您設計了一個從數組中隨機選擇項目的函數,確保最近的選擇不會重複。雖然目前的解決方案有效,但您擔心其效率以及是否會導致過度循環。讓我們探索一種更有效的方法。
1。遞歸注意事項
是的,您的 ChooseName() 函數可以被視為遞歸函數,因為它會呼叫自身,直到找到唯一的名稱。遞歸對於某些問題可能很有用,但重要的是要注意堆疊的使用和深度過大的可能性。
2。高效率的解決方案
為了解決效率問題,我們可以採取不同的策略。我們可以建立原始陣列的副本並從副本中隨機選擇項目,直到選擇所有項目,而不是依賴遞歸和循環直到找到唯一的名稱。一旦所有項目都用完,我們將副本重置為其原始狀態。
這是此方法的 JavaScript 實作:
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.
此方法利用 JavaScript 的陣列 slice() 方法建立原始陣列的淺表副本。然後,它重複地從副本中選擇隨機項目並將其從副本中刪除,從而有效地模仿隨機選擇,而不重複,直到所有項目都用盡為止。一旦選擇了所有項目,副本就會重置,從而可以重新開始隨機選擇。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3