Algorithm 依赖逻辑:如果/那么是唯一/最好的方法吗?

Algorithm 依赖逻辑:如果/那么是唯一/最好的方法吗?,algorithm,logic,Algorithm,Logic,我有一个N个布尔值的序列。他们中的一些人依赖于其他人。例如,如果N[0]为false,则所有其他值也必须为false。如果N[0]为真,则N[1]可以为真或假。如果N[1]为false,则N[2]必须为false,但所有其他布尔值仍然可以为true或false 我想要一个程序来显示序列的所有可能排列,但我不知道如何在不写出一系列if/then语句的情况下实现这一点。有人建议我可以使用enum,但基于我对enum如何工作的理解,我最终还是会得到一长串if/then语句,并且它只适用于这个问题。我已

我有一个N个布尔值的序列。他们中的一些人依赖于其他人。例如,如果N[0]为false,则所有其他值也必须为false。如果N[0]为真,则N[1]可以为真或假。如果N[1]为false,则N[2]必须为false,但所有其他布尔值仍然可以为true或false

我想要一个程序来显示序列的所有可能排列,但我不知道如何在不写出一系列
if/then
语句的情况下实现这一点。有人建议我可以使用enum,但基于我对enum如何工作的理解,我最终还是会得到一长串
if/then
语句,并且它只适用于这个问题。我已经思考了几天,试图弄清楚如何构建更具活力的东西。伪代码如下所示:

public List<string> permutations (int N, int[][] dependencies)
{
     Create boolean array of size N;
     Set array[0] to false;
     Check dependencies on array[0], flip other values accordingly -- in this case, the permutation is complete. All values are 0.
     Set array[0] to true;
     Check dependencies...
     Set array[1] to false;
     Check...
     Set array[1] to true;
     ...
}
希望问题在这一点上是清楚的。除了
if/then
之外,还有其他设置守门员的方法吗?或者嵌套/级联
if/then
语句是正确的处理方法吗

编辑

关于规则是什么的问题,这是我问题的一部分。这里的规则是动态的吗?我可以用任意N个布尔值序列,将其中一些标记为依赖项,或者可能标记为门,然后得出所有排列吗?这里有一套可能的规则

  • 如果元素B依赖于元素A,那么只要A为false,元素B就是false
  • 如果元素B依赖于元素A且元素A为真,则B可以为真或假
  • 依赖关系可以是一对一或一对多。如果元素B依赖于元素A,元素C也可能依赖于元素A。元素C不必依赖于元素B
  • 考虑这个场景——(A:B,C,D,E,F;F:G,H)(意思是B-E依赖于A,G-H依赖于F。如果A为假,一切都是假。如果A为真,B-F可以是真或假,然后我们开始下一个级别。如果F为假,G-H为假。如果F为真,则G-H可以是真或假

    因此,我的输出应该是从A-H=false到A-H=true的所有可能的值组合。

    暴力方式:

    public List<Boolean[]> validPermutations (int N, Dependency[] rules){
        List<Boolean[]> list = new ArrayList<Boolean[]>();
        boolean[] perm = new boolean[N];//the permutation to test. initially all false
        for(int pcount = 1; pcount <= Math.pow(2, N)); p++){
            boolean valid = true;
            for(Dependency d : rules){
                if(!d.isSatisfied(perm)){
                    valid = false;
                    break;
                }
            }
            if(valid) list.add(perm);
            //now "increment" the boolean array to the next permutation
            //it will take on all 2^N possibilites over the course of the for loop
            boolean notDoneShifting = true;
            int i = 0;
            while(notDoneShifting){
                notDoneShifting = perm[i];
                perm[i] = !perm[i];
                i++;
            }
        }
    }
    
    公共列表有效术语(int N,依赖项[]规则){
    列表=新的ArrayList();
    boolean[]perm=new boolean[N];//要测试的置换。最初全部为false
    
    对于(int pcount=1;pcount)来说,如果你不告诉我们所有的“规则”是什么,就很难找到答案我同意@SamIam的观点吗?如果你不定义规则,我无法知道决定某个值是真是假的逻辑是什么。你读过摩尔和米利状态机吗?一些关于它们如何运行的背景资料可能会帮助你解决这个问题。我想这种状态机逻辑是你正在尝试的用你的if/else逻辑来定义。希望我能告诉你更多关于它们的信息,但我的电子学学位已经太久了!这个答案可能会有所帮助:而这个答案:这与排列或组合无关。如果我理解正确,你正在寻找一种生成命题公式真值表的方法,或者只是它的真实行。
    public List<Boolean[]> validPermutations (int N, Dependency[] rules){
        List<Boolean[]> list = new ArrayList<Boolean[]>();
        boolean[] perm = new boolean[N];//the permutation to test. initially all false
        for(int pcount = 1; pcount <= Math.pow(2, N)); p++){
            boolean valid = true;
            for(Dependency d : rules){
                if(!d.isSatisfied(perm)){
                    valid = false;
                    break;
                }
            }
            if(valid) list.add(perm);
            //now "increment" the boolean array to the next permutation
            //it will take on all 2^N possibilites over the course of the for loop
            boolean notDoneShifting = true;
            int i = 0;
            while(notDoneShifting){
                notDoneShifting = perm[i];
                perm[i] = !perm[i];
                i++;
            }
        }
    }