我知道这个问题有很多种,但是我还没有找到与我的效率问题相关的答案。
我有下面的代码工作正常。
我有一个10个项目的数组,可以从中随机选择一个项目(按Enter键)。该代码保留了不能随机选择的5个最近选择的数组(以避免随着时间的推移而重复过多)。
如果chooseName()函数最初选择了最近5次使用的名称,它只会中断并再次调用自身,重复直到找到“唯一”名称。
我有两个问题:
说这是“递归函数”是否正确?
我担心从理论上讲,这可能会循环很长时间,然后再找到一个唯一的名称-是否有更有效的方法?
感谢您的任何帮助。
var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"]; var b = []; var chooseName = function () { var unique = true; b.length = 5; num = Math.floor(Math.random() * a.length); name = a[num]; for (i = 0; i < a.length; i++) { if (b[i] == name) { chooseName(); unique = false; break; } } if (unique == true) { alert(name); b.unshift(name); } } window.addEventListener("keypress", function (e) { var keycode = e.keyCode; if (keycode == 13) { chooseName(); } }, false);
每当选择一项时,将其移至阵列的背面,然后从原始阵列的一部分中随机选择array.slice(0, -5)。
array.slice(0, -5)
var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"]; var chooseName = function () { var unique = true; num = Math.floor(Math.random() * a.length - 5); name = a.splice(num,1); a.push(name); } window.addEventListener("keypress", function (e) { var keycode = e.keyCode; if (keycode == 13) { chooseName(); } }, false);
编辑:这也有一个副作用,即不给任何出现在列表尾部的变量一个不公平的缺点,即在前N个调用中不会考虑它们。如果这对您来说是个问题,请尝试在某个位置保留一个静态变量,以跟踪要使用的切片的大小,并将其最大化为B(在这种情况下为5)。例如
var a = ["Roger", "Russell", "Clyde", "Egbert", "Clare", "Bobbie", "Simon", "Elizabeth", "Ted", "Caroline"]; B = 5; //max size of 'cache' N = 0; var chooseName = function () { var unique = true; num = Math.floor(Math.random() * a.length - N); N = Math.min(N + 1, B); name = a.splice(num,1); a.push(name); }