什么是卡诺图?卡诺图是真值表的一种变形,它可以在给定的矩形内组织一个具有n个变量的逻辑函数的2^n个最小项。在表中,为相邻最小项的邻接律简化提供了直观的图形工具(相邻的AND项)。在某些情况下,卡诺图可以让你的逻辑一目了然,但是如果需要处理的逻辑函数的自变量比较多,卡诺图会让图变得更复杂。再举一个简单的例子。有绿、黄、红三种灯。当满足以下四种情况中的任何一种时,需要按下按钮:绿灯、黄灯、红灯全部熄灭。黄灯灭,红灯亮。绿灯灭,黄灯亮绿灯、黄灯、红灯全亮如果让你写一段代码来判断是否需要按某个按钮,很多人会这样写:/***@parambool$a绿灯状态,true为开,false为关*@parambool$a黄灯状态,true为开,false为关*@parambool$a红灯状态,true开启,false关闭*@returnbool*/functioncheckEnterBtn(bool$a,bool$b,bool$c):bool{if((!$a&&!$b&&!$c)||(!$b&&$c)||(!$a&&$b)||($a&&$b&&$c)){返回真;}return;}上面的代码是不是感觉特别繁琐?没错,让我们开启高能模式,将卡诺图应用到我们实际的编码中。定义一个命题:从上面的四个条件,我们可以清楚的看出逻辑计算涉及的变量只有三个,所以我们为它们分别定义一个命题:命题A:绿灯亮命题B:黄灯亮关于命题C:红灯亮,画出卡诺图结构。我们在这里使用的卡诺图是可变卡诺图的变体。我们之所以让命题B和命题C在这里相交,是为了覆盖所有的变量。如果只有两个变量参与运算,卡诺图的机制就是一个4x4的正方形。有关更复杂的卡诺图,请参阅维基百科。在卡诺图中标出四个条件,然后我们在符合以上四个条件的方框上打勾。在上图中,我们可以一目了然地看到在什么情况下需要按下按钮。接下来,我们用虚线将相邻勾选框形成的最大网格围起来,形成一个组合框(组合框可以相互重叠)。这时我们可以看到图中有两个组合框,即:水平组合框,也就是A为false的区域,所以用?A来表示。垂直组合框是C为真的区域,所以用C表示。实际代码实现了一步得到的两个组合框,即:/***判断按钮是否可以按下*@parambool$a绿灯状态*@parambool$b黄灯状态*@parambool$c红灯状态*@returnbool*/functioncheckEnterButton($a,$b,$c){if(!$a||$c){//这里的两个条件就是上一步中的两个组合框的内容returntrue;}returnfalse;}总结当然,卡诺图并不能在任何情况下都用来简化逻辑。当运算涉及的变量过多时,卡诺图就会变得非常复杂。所以需要区分什么情况下可以使用这个方法。好了,到这里了。对比一下两种实现方式,是不是简单很多?由此可见数学对程序员的重要性。
