我知道已经为类似的问题提供了一些答案,但它们似乎都不适合我的问题。我正在制作一个程序来为Granny Squares生成图像,或者在内部有不同颜色环的正方形。
用户可以选择有多少环,因此所需的颜色数量会发生变化。因此,我不能使用嵌套的for循环来遍历每种颜色,因为for循环的数量必须改变。有没有办法为这些颜色创建组合?
例如,如果我使用白色,蓝色和绿色,则以下组合为白色,白色,白色;白色,白色,蓝色;白色,白色,绿色;白色,蓝色,白色;那么有没有办法在没有嵌套for循环的情况下完成这个?
答案 0 :(得分:0)
这是一种使用递归实现此目的的算法。
public static void combine(List<Character> colors, List<Character> combination) {
if (combination.size() == colors.size()) {
System.out.println(combination);
} else {
for (char color : colors) {
combination.add(color);
combine(colors, combination);
combination.remove(combination.size() - 1);
}
}
}
public static void main(String[] args) {
List<Character> colors = new ArrayList<>();
colors.add('W');
colors.add('B');
colors.add('G');
combine(colors, new LinkedList<Character>());
}
colors
是原始颜色列表(W,B,G)
combinations
是一个在整个递归过程中不断修改的列表,用于保存当前组合。
以下是combination
在第一次遇到基本情况之前会发生什么
[W] // add W, call recursively
[W, W] // add W, call recursively
[W, W, W] // add W, call recursively
现在已满足基本情况,并打印[W, W, W]
。然后它删除我们在列表中放入的最后一种颜色W,并将colors
中的下一种颜色添加到combination
,这会给出[W, W, B]
。基本案例再次得到满足,因此将其打印出来。
在完成所有组合打印之前,它会继续执行此操作。