jquery:避免过多的递归

时间:2016-03-24 23:13:21

标签: javascript jquery multithreading recursion

我有一个脚本可以随机分配4个玩家的54张扑克牌,它会产生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;
    }
});

1 个答案:

答案 0 :(得分:1)

以您实现它的方式修复递归非常简单。只需用while语句替换你的call和if语句。

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;
}

话虽如此,有一些基本的更好的方法来处理这样的有限集。存储未使用的卡并从中随机选择是非常优越的。