Java随机排序数组递归

时间:2019-06-12 17:58:54

标签: java recursion

我目前正在用Java开发BlackJack应用程序,并且我必须以递归的方式处理Deck

我已经尝试过了,但是我的教授说正确的方法是递归

public void shuffle() {
        ArrayList<Card> colCards = new ArrayList<Card>();
        Random  random = new Random();
        int randomIndex =0; 
        int lenght = this.cards.size();
        for (int i = 0; i < lenght; i++) {
              randomIndex = random.nextInt(this.cards.size()-1-0)+0);

                        colCards.add(this.cards.get(randomIndex));
                        this.cards.remove(randomIndex)

        }
                this.cards = colCards;

}

目前正在工作,但我正在寻找一种递归的方法

2 个答案:

答案 0 :(得分:0)

与简单循环相比,递归是一项非常昂贵的操作。而且,如果您可以在递归和循环之间进行选择,请选择循环,因为这样做会更快,并且永远不会出现堆栈溢出。

但是,如果目标是使用递归来解决问题,则可以这样:

public List<Object> shuffle(List<Object> cards, int pos) {
    if (pos == cards.size() - 2)
        return cards;

    Object card = cards.get(pos);

    if (Math.random() > 0.5) {
        cards.set(pos, cards.get(pos + 1));
        cards.set(pos + 1, card);
    } else if (Math.random() < 0.5) {
        if (pos != 0) {
            cards.set(pos, cards.get(pos - 1));
            cards.set(pos - 1, card);
        } else {
            cards.set(pos, cards.get(pos + 1));
            cards.set(pos + 1, card);
        }
    }

    return shuffle(cards, ++pos);
}

答案 1 :(得分:0)

这是另一种适用于任何对象类型的方式。但是,递归并没有获得任何好处,因为重复的方法调用只是代替了循环。


   public <T> void shuffle(List<T> values, int n) {
      if (n == 0) {
         return;
      }
      int d = (int) (Math.random() * (n-1));
      T c = values.get(n - 1);
      values.set(n - 1, values.get(d));
      values.set(d, c);
      shuffle(values, n - 1);
   }

将值从k的某个随机位置0 <= k < n-1移动到位置n-1。每次经过n都会减少1