您设计了一个从数组中随机选择项目的函数,确保最近的选择不会重复。虽然当前的解决方案有效,但您担心其效率以及是否会导致过度循环。让我们探索一种更有效的方法。
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