Javascript jquery:避免过多的递归
我有一个脚本,将54张扑克牌随机分配给4名玩家,它将生成2个随机数以获得一张随机牌,类别号(从1到4)表示“红桃、黑桃、钻石、梅花”,以及卡号(从1到13) 问题是这个脚本中有太多的递归,那么如何通过在线程或类似的东西中调用函数来避免这个错误呢 我的代码:Javascript jquery:避免过多的递归,javascript,jquery,multithreading,recursion,Javascript,Jquery,Multithreading,Recursion,我有一个脚本,将54张扑克牌随机分配给4名玩家,它将生成2个随机数以获得一张随机牌,类别号(从1到4)表示“红桃、黑桃、钻石、梅花”,以及卡号(从1到13) 问题是这个脚本中有太多的递归,那么如何通过在线程或类似的东西中调用函数来避免这个错误呢 我的代码: $(document).ready(function(){ var human = []; var east = []; var west = []; var north = []; var used_
$(document).ready(function(){
var human = [];
var east = [];
var west = [];
var north = [];
var used_cards = [];
distributeCards(north,$('#north'));
distributeCards(east,$('#east'),'vertical');
distributeCards(west,$('#west'));
distributeCards(human,$('#south'));
function distributeCards(array,container,view){
for(var i = 0; i < 13; i++){
var category,card;
do{
var uniqueCard = uniqueRandomCard();
}while(typeof uniqueCard === "undefined")
category = uniqueCard[0];
card = uniqueCard[1];
array.push(uniqueCard);
var category_name = '';
if(category === 1){
category_name = 'hearts';
}
else if(category === 2){
category_name = 'spades';
}
else if(category === 3){
category_name = 'diamonds';
}
else if(category === 4){
category_name = 'clubs';
}
if(card === 1){
card = 'ace';
}
else if(card === 11){
card = 'jack';
}
else if(card === 12){
card = 'queen';
}
else if(card === 13){
card = 'king';
}
if(view === 'vertical'){
$(container).children('.row').append('<img src="cards/backRotate.png" class="card"/>');
}
else if(view === 'horizontal'){
$(container).children('.row').append('<img src="cards/back.png" class="card"/>');
}
}
}
function randomNumberFromRange(min,max){
return Math.round(Math.floor(Math.random()*max)+min);
}
function uniqueRandomCard(){
var card = randomNumberFromRange(1, 13);
var category = randomNumberFromRange(1, 4);
if(!inAssocArray(category,card,used_cards)){
var array = [];
array[0] = category;
array[1] = card;
used_cards.push(array);
return array;
}
else{
uniqueRandomCard();
}
}
function inAssocArray(key,value,array){
var flag = false;
for(var i = 0; i < array.length; i++){
if(array[i][0] === key && array[i][1]=== value){
flag = true;
}
}
return flag;
}
});
$(文档).ready(函数(){
var-human=[];
var east=[];
var west=[];
var north=[];
使用的var_卡=[];
分布区(北部,$(“#北部”);
分流河道(东部,$('东部'),'垂直');
分布区(西部,$(“#西部”);
分布区(人类,$(“#南”);
函数distributeCards(数组、容器、视图){
对于(变量i=0;i<13;i++){
var类别、卡片;
做{
var uniqueCard=uniqueRandomCard();
}while(uniqueCard的类型==“未定义”)
类别=唯一卡[0];
卡=唯一卡[1];
数组。推送(uniqueCard);
变量类别名称=“”;
如果(类别==1){
类别名称=‘红心’;
}
否则如果(类别===2){
类别名称=‘黑桃’;
}
否则如果(类别===3){
类别名称=‘钻石’;
}
否则如果(类别===4){
类别名称=‘俱乐部’;
}
如果(卡===1){
卡片='ace';
}
否则如果(卡===11){
卡片=‘杰克’;
}
否则如果(卡===12){
卡片=‘女王’;
}
否则如果(卡===13){
卡片=‘国王’;
}
如果(视图==‘垂直’){
$(容器).children('.row').append('');
}
否则,如果(视图==‘水平’){
$(容器).children('.row').append('');
}
}
}
函数randomNumberFromRange(最小值、最大值){
返回Math.round(Math.floor(Math.random()*max)+min);
}
函数uniqueRandomCard(){
var卡=随机数范围(1,13);
var类别=随机数范围(1,4);
if(!inAssocArray(类别、卡片、已用卡片)){
var数组=[];
数组[0]=类别;
数组[1]=卡;
用过的卡。推送(阵列);
返回数组;
}
否则{
uniqueRandomCard();
}
}
函数数组(键、值、数组){
var标志=假;
对于(var i=0;i
以实现递归的方式修复递归非常简单。只需将call和if语句替换为while语句即可
function uniqueRandomCard(){
var card = randomNumberFromRange(1, 13);
var category = randomNumberFromRange(1, 4);
while(inAssocArray(category,card,used_cards)) {
card = randomNumberFromRange(1, 13);
category = randomNumberFromRange(1, 4);
}
var array = [];
array[0] = category;
array[1] = card;
used_cards.push(array);
return array;
}
也就是说,有一些基本的更好的方法来处理这样的有限集合。存储未使用的卡并从中随机选择要优越得多。您的uniqueRandomCard()函数似乎是唯一具有递归的函数,它有一个逻辑错误,即它在调用自身时不对返回值执行任何操作。您可以通过另一个函数中检查未定义的while循环来处理这个问题,但是直接修复它不是更好吗?但是我根本不知道为什么要在那里使用递归-难道你不能在uniqueRandomCard()中使用while循环吗?@nnnnnn它应该被递归调用,直到它返回一个在
已用卡片中找不到的值为止array@nnnnnn是的,while循环会是一个更好的主意,我怎么没想到会尝试!!谢天谢地,在我看来,更好的解决方案是将所有可能的牌放在牌组中
数组中,实现shuffle()
方法,然后从牌组顶部取下牌进行交易。