Java:给出数字N的true和false组合的生成器;

我尽可能地简化任务,所以我可以将它应用到我的算法中。

这是数学家和程序员面临的挑战:

我需要创建一个传递参数int n的方法:

public void optionality_generator(int n){ //some kind of loops, or recursions...to make it workable System.out.println("current combination: ..."); } 

输出应显示true和false的所有可能组合。

这是N = 1的例子; N = 2; N = 3; N = 4; N = 5,其中x =假,0 =真; 请注意,空的断裂线只是为了让您更容易识别图案。 希望,我包括所有可能的组合):

 Combination of 1: 0 x Combination of 2: 00 x0 0x xx Combination of 3: 000 X00 0X0 00X XX0 0XX XXX Combination of 4: 0000 X000 0X00 00X0 000X XX00 X0X0 X00X 0XX0 0X0X 00XX XXX0 XX0X X0XX 0XXX XXXX Combination of 5: 00000 X0000 0X000 00X00 000X0 0000X XX000 X0X00 X00X0 X000X X0X00 X00X0 X000X 0XX00 0X0X0 0X00X 00XX0 00X0X 000XX XXX00 XX0X0 XX00X X0XX0 X0X0X X00XX 0XXX0 0XX0X 00XXX XXXX0 XXX0X XX0XX X0XXX 0XXXX XXXXX 

此外,如果您看到输出,这是我识别的模式,所有组合都反转一半(例如,第一个组合是00000,最后一个将是XXXXX,第二个是X0000,一个在最后一个之前将是0XXXX等…) 。 也许,这种模式将有助于使整个算法更有效,不确定这一点。 先谢谢你!

这是一种仅使用Java API的基本方法:

 final int n = 3; for (int i = 0; i < Math.pow(2, n); i++) { String bin = Integer.toBinaryString(i); while (bin.length() < n) bin = "0" + bin; System.out.println(bin); } 

结果:

 000 001 010 011 100 101 110 111 

当然,您可以将n设置为您喜欢的任何内容。 并且,通过此结果,您可以从字符串中选择第n个字符为true / false。

如果您只需检查某位是否为真,则无需将其转换为字符串。 这只是为了说明输出值。

只是一个线索,但想想为最多’n’位的数字设置的位。 你会看到你是否从0到’n’位(在这种情况下为3); 这些位是000,001,010,011,100,101,110,111。您可以使用((n * n)-1)公式计算出能够容纳’n’位的最大数。

这应该可以解决问题

 int cols = 3; int rows = (int) Math.pow(2, cols); for (int row = 0; row < rows; row++) System.out.println(String.format("%" + cols + "s", Integer.toBinaryString(row)).replace(' ', '0').replace('1', 'X')); 

出:

 000 00X 0X0 0XX X00 X0X XX0 XXX 

这是使用递归实现的简单版本

 public void optionality_generator(int n){ ArrayList strings = generatorHelper(n); for(String s : strings){ System.out.println(s); } } private ArrayList generatorHelper(int n){ if(n == 1){ ArrayList returnVal = new ArrayList(); returnVal.add("0"); returnVal.add("X"); return returnVal; } ArrayList trueStrings = generatorHelper(n-1); for(String s : trueStrings){ s += "0"; } ArrayList falseStrings = generatorHelper(n-1); for(String s : falseStrings){ s += "X"; } trueStrings.addAll(falseStrings); return trueStrings; } 

这是一个测试驱动的版本:

 import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.Test; public class OptionalityTest { @Test public void testOptionality0() throws Exception { assertEquals("[]", optionality(0).toString()); } @Test public void testOptionality1() throws Exception { assertEquals("[0, x]", optionality(1).toString()); } @Test public void testOptionality2() throws Exception { assertEquals("[00, x0, 0x, xx]", optionality(2).toString()); } @Test public void testOptionality3() throws Exception { assertEquals("[000, x00, 0x0, xx0, 00x, x0x, 0xx, xxx]", optionality(3).toString()); } private List optionality(int i) { final ArrayList list = new ArrayList(); if (i == 1) { list.add("0"); list.add("x"); } if (i > 1) { List sublist = optionality(i - 1); for (String s : sublist) { list.add("0" + s); list.add("x" + s); } } return list; } } 

以下是上述Erics代码的修改,它使用c#并允许输入任意数量的布尔变量名。 它将输出c#代码中的所有可能组合,以便插入到if语句中。 只需使用var名称编辑第一行代码,然后在LINQpad中运行以获取文本输出。

输出示例……

 !VariableNameA && !VariableNameB && !VariableNameC !VariableNameA && !VariableNameB && VariableNameC !VariableNameA && VariableNameB && !VariableNameC !VariableNameA && VariableNameB && VariableNameC VariableNameA && !VariableNameB && !VariableNameC VariableNameA && !VariableNameB && VariableNameC VariableNameA && VariableNameB && !VariableNameC VariableNameA && VariableNameB && VariableNameC 
  //To setup edit var names below string[] varNames = { "VariableNameA", "VariableNameB", "VariableNameC" }; int n = varNames.Count(); for (int i = 0; i < Math.Pow(2, n); i++) { String bin = Convert.ToString(i, 2); while (bin.Length < n) { bin = "0" + bin; } string and = " && "; string f = "!"; string t = " "; var currentNot = bin[0] == '0' ? f : t; //string visual = bin[0].ToString(); string visual = currentNot + varNames[0]; for (var j = 1; j < n; j++) { currentNot = bin[j] == '0' ? f : t; //visual = visual + and + bin[j].ToString(); visual = visual + and + currentNot + varNames[j]; } Console.WriteLine(visual); }