Javascript jquery:避免过多的递归

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_

我有一个脚本,将54张扑克牌随机分配给4名玩家,它将生成2个随机数以获得一张随机牌,类别号(从1到4)表示“红桃、黑桃、钻石、梅花”,以及卡号(从1到13)

问题是这个脚本中有太多的递归,那么如何通过在线程或类似的东西中调用函数来避免这个错误呢

我的代码:

$(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()
方法,然后从牌组顶部取下牌进行交易。