我遇到这种情况,我需要让用户根据给定条件的数量来定义决策。例如,假设有两个条件(IsMale和IsSmoker),我的程序需要自动生成如下矩阵:
IsMale: YES YES NO NO
IsSmoker: YES NO YES NO
并且deicsion由用户定义,因此以下任何一个都是有效的:
IsMale: YES YES NO NO
IsSmoker: YES NO YES NO
Decision: T F T F
IsMale: YES YES NO NO
IsSmoker: YES NO YES NO
Decision: F F F F
IsMale: YES YES NO NO
IsSmoker: YES NO YES NO
Decision: T T T T
对于每种情况,只能有两种状态, True 和 False 。因此,组合的总数计算如下:
状态(S)没有条件(C) S ^ C =组合总数
4种可能性(2 ^ 2 = 4)
Condition A T T F F
Condition B T F T F
8种可能性(2 ^ 3 = 8)
Condition A T T T T F F F F
Condition B T T F F T F T F
Condition C T F T F T T F F
希望我比原来的问题更好地解释了自己。
更新 根据{{3}}给出的答案。下面是他的算法的手工计算,以生成不同的组合。
4 possibilities (2^2=4)
指数= 0,(右移0)
binary 8 4 2 1 Value
original 0 0 0 1 1
& 1 0 0 0 1 1 T
original 0 0 1 0 2
& 1 0 0 0 1 0 F
original 0 0 1 1 3
& 1 0 0 0 1 1 T
original 0 1 0 0 4
& 1 0 0 0 1 0 F
指数= 1,(右移1)
binary 8 4 2 1 Value
original 0 0 0 1 1
shift 0 0 0 0 0
& 1 0 0 0 1 0 F
original 0 0 1 0 2
shift 0 0 0 1 1
& 1 0 0 0 1 1 T
original 0 0 1 1 3
shift 0 0 0 1 1
& 1 0 0 0 1 1 T
original 0 1 0 0 4
shift 0 0 1 0 2
& 1 0 0 0 1 0 F
组合:
Condition 1: TFTF
Condition 2: FTTF
答案 0 :(得分:4)
输出矩阵非常简单:
int conditions = 3;
for (int c = 0; c < conditions; c++) {
Console.WriteLine(
"Condition {0} : {1}",
(char)('A' + c),
new String(
Enumerable.Range(0, (1 << conditions))
.Select(n => "TF"[(n >> c) & 1])
.ToArray()
)
);
}
那么,你想用它做什么?
答案 1 :(得分:2)
正如 djna 在他/她的回答中提到的那样,你错过了决定的输出。
例如,如果您有一个带两个输入的运算符(例如:和,或运算符),则必须对所有可能的输入进行尝试。对于一个非常简单的简单运算符,因为只有四个可能的输入,但对于更复杂的运算符,您必须生成2 ^ n个可能的输入来计算所有可能的输出。
我建议在n个布尔变量数组中执行此操作,在这里您可以翻转位以获得2 ^ n个可能的输入,然后使用生成的输入数组测试运算符并打印结果。
生成数组的一种简单方法是创建一个循环,在该循环中将变量从0增加到2 ^ n - 1,然后将数字转换为二进制。你会得到这样的东西:(对于n = 3):
0: 0 0 0
1: 0 0 1
2: 0 1 0
3: 0 1 1
4: 1 0 0
5: 1 0 1
6: 1 1 0
7: 1 1 1
希望这有帮助!
答案 2 :(得分:0)
我想我知道你在说什么。如果您的条件不是那么糟糕,您可以说:
if (A && B && C) { return X; } if (!A && B && C) { return Y; }等等哦!我想你想要产生所有不同的条件组合!你想要排列!如果你只有二元,先生,可以通过计算找到每个组合。
我不太关注:
它看起来像
State 1 2 3 4 Condition A T T F F
<?/ s的>
答案 3 :(得分:0)
除非我遗漏了某些东西,否则你的问题定义中会遗漏一些东西。您已经定义了可能的输入范围,这肯定很容易生成?
Condition A T T F F
Condition B T F T F
Decision T F F F
需要定义输出,不能推断出。作为一个例子,我填写了一个AND。
似乎我的滑稽“容易生成”就是问题所在。递归解决方案不起作用吗?for (members of getListOfCombinedStates(n) )
print theMember
getListOfCombinedStates(int howMany) {
if ( n == 1 )
return list of possible States
else {
create empty resultlist
for ( members of getListofCombinedStates(howMany -1) )
for ( members of listOfStates )
create new CombinedState by suffixing state, add to resultList
return resultList
}
因此,对于n = 2,我们调用getListOfCombinedStates(2),它调用getListOfCombinedStates(1),并返回{T,F}。
getListOfCombinedStates(2)然后迭代{T,F}并将第一个T和它们F添加到每个成员,产生{T,T}和{T,F},然后{F,T}和{F,F}。
我希望getListOfCombinedStates(3)能够反过来调用getListOfCombinedStates(2)并生成所需的值。
答案 4 :(得分:0)
我不确定你的意思,但也许这就是你要找的东西:
我做了一些调整,因为你的第二个例子与第一个例子不一致;并且否定了这些位(我将F替换为0,将T替换为1),以表明我的观点。
Condition A 0 0 0 0 1 1 1 1
Condition B 0 0 1 1 0 0 1 1
Condition C 0 1 0 1 0 1 0 1
现在,观察每个列的模式,并考虑二进制数;)。
(我希望你明白这个主意。)