如何用布尔代数简化多个 if-else 条件?
How to simplify multiple if-else conditions with boolean algebra?
问题是下面代码中哪个if-else
分支是多余的?
if (x<3 && y>3)
printf("Test OK!\n");
else if (x>=3 && y>=3)
printf("Test OK!\n");
else if (z>3 && x>=3)
printf("Test OK!\n");
else if (z<=3 && y>=3)
printf("Test OK!\n");
else
printf("Test failed!\n");
我的想法是将条件视为事件:
x<3 -> p
y>3 -> q
y>=3 -> m
z>3 -> n
这个问题等同于从中选择一个多余的问题:
p*q
^p*q
n*^p
^n*m
然而,由于 p q n m
不是独立事件,我真的被困住了。感谢您的帮助!
如果您希望简单地删除一个 if
条件并使其正常工作,那么我认为您无法使用此集合来做到这一点。也就是说,我试了一下布尔值归约,它确实简化了 if-else
个案例。
首先,让我们将 y>3
视为 y>=3 && y!=3
。这使您的第一个 if
案例
if (x<3 && y>=3 && y!=3)
由于我的大脑更适合面向相同方向的大于符号,因此我将您的条件重新定义为:
X: x>=3
Y: y>=3
A: y!=3
Z: z>3
现在,您的 if-then
个案例可以用布尔代数写成:
^XYA + XY + ZX + ^ZY
这是我的真相 table 其中 Q
是上述布尔方程的结果
here
还有我的Karnaugh Map: here
将等式简化为:
YA + ZX + ^ZY
然后回到代码
if (y>3)
printf("Test OK!\n");
else if (z>3 && x>=3)
printf("Test OK!\n");
else if (z<=3 && y>=3)
printf("Test OK!\n");
else
printf("Test failed!\n");
问题是下面代码中哪个if-else
分支是多余的?
if (x<3 && y>3)
printf("Test OK!\n");
else if (x>=3 && y>=3)
printf("Test OK!\n");
else if (z>3 && x>=3)
printf("Test OK!\n");
else if (z<=3 && y>=3)
printf("Test OK!\n");
else
printf("Test failed!\n");
我的想法是将条件视为事件:
x<3 -> p
y>3 -> q
y>=3 -> m
z>3 -> n
这个问题等同于从中选择一个多余的问题:
p*q
^p*q
n*^p
^n*m
然而,由于 p q n m
不是独立事件,我真的被困住了。感谢您的帮助!
如果您希望简单地删除一个 if
条件并使其正常工作,那么我认为您无法使用此集合来做到这一点。也就是说,我试了一下布尔值归约,它确实简化了 if-else
个案例。
首先,让我们将 y>3
视为 y>=3 && y!=3
。这使您的第一个 if
案例
if (x<3 && y>=3 && y!=3)
由于我的大脑更适合面向相同方向的大于符号,因此我将您的条件重新定义为:
X: x>=3
Y: y>=3
A: y!=3
Z: z>3
现在,您的 if-then
个案例可以用布尔代数写成:
^XYA + XY + ZX + ^ZY
这是我的真相 table 其中 Q
是上述布尔方程的结果
here
还有我的Karnaugh Map: here
将等式简化为:
YA + ZX + ^ZY
然后回到代码
if (y>3)
printf("Test OK!\n");
else if (z>3 && x>=3)
printf("Test OK!\n");
else if (z<=3 && y>=3)
printf("Test OK!\n");
else
printf("Test failed!\n");