我正在编写一个模块来处理掷骰子。给定 x y 边的骰子,我试图列出所有潜在的掷骰组合。
这段代码假设有 3 个骰子,每个骰子有 3 个面,分别标记为 1、2 和 3。(我意识到我使用的是“幻数”,但这只是为了简化并让基本代码正常工作。)
int[] set = { 1, 1, 1 };
list = diceroll.recurse(0,0, list, set);
...
public ArrayList<Integer> recurse(int index, int i, ArrayList<Integer> list, int[] set){
if(index < 3){
// System.out.print("\n(looping on "+index+")\n");
for(int k=1;k<=3;k++){
// System.out.print("setting i"+index+" to "+k+" ");
set[index] = k;
dump(set);
recurse(index+1, i, list, set);
}
}
return list;
}
(dump() 是一种简单的方法,只显示 list[] 的内容。变量i暂时不用。)
我正在尝试做的是将 list[index] 递增一,逐步遍历列表的整个长度并随着我的前进而递增。
这是我的“最佳尝试”代码。这是输出:
粗体输出是我正在寻找的。我不知道如何摆脱其余的。(这是假设三个骰子,每个骰子有 3 个面。使用递归,所以我可以将它扩展到任何具有 y 面的 x 骰子。)
[1][1][1] [1][1][1]
[1][1][1] [1][1][2] [1][1][3] [1][2][3]
[1][2][1] [1][2][2] [1][2][3] [1][3][3]
[1][3][1] [1][3][2] [1][3][3] [2][3][3] [2][1][3]
[2][1][1] [2][1][2] [2][1][3] [2][2][3]
[2][2][1] [2][2][2] [2][2][3] [2][3][3]
[2][3][1] [2][3][2] [2][3][3] [3][3][3] [3][1][3]
[3][1][1] [3][1][2] [3][1][3] [3][2][3]
[3][2][1] [3][2][2] [3][2][3] [3][3][3]
[3][3][1] [3][3][2] [3][3][3]
我为格式道歉,我能想出的最好的。
任何帮助将不胜感激。(这种方法实际上是为了将数据用于非常琐碎的事情,但已经变成了个人挑战。:)
编辑:如果有另一种方法来解决这个问题,我会全力以赴,但我也想解决我当前的问题并成功地将递归用于有用的东西。
edit2:运行代码,包括“简单修复”。当心未使用的变量和奇怪的黑客,我还没有清理它。
package code.testing;
import java.util.ArrayList;
public class CodeTesting {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
int[] set = { 1, 1, 1 };
list = recurse(0,0, list, set);
}
public static ArrayList<Integer> recurse(int index, int i, ArrayList<Integer> list, int[] set){
if(index < 3){
// System.out.print("\n(looping on "+index+")\n");
for(int k=1;k<=3;k++){
// System.out.print("setting i"+index+" to "+k+" ");
set[index] = k;
if (index==2){
dump(set);
}
recurse(index+1, i, list, set);
}
}
return list;
}
static void dump(int[] arr) {
for (int s : arr) {
System.out.format("[%s]", s);
}
System.out.println();
}
}