我目前正在用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;
}
目前正在工作,但我正在寻找一种递归的方法
答案 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
。