卡诺图是真值表的变形,它能够将有n个变量的逻辑函数的2^n个最小项组织在给定的长方形表格中,同时为相邻最小项(相邻与项)运用邻接律化简提供了直观的图形工具。在部分状况下,卡诺图能让你的逻辑变得一目了然,可是若是须要处理的逻辑函数的自变量较多,卡诺图会使图形更加复杂。更多
php
现有绿、黄、红三颗灯,当知足下面四个条件中任何一个时,须要按下按钮:程序员
若是让你写一段代码来判断是须要按下按钮,不少人会这么写:函数
/** * @param bool $a 绿灯的状态,true为亮,false为熄灭 * @param bool $a 黄灯的状态,true为亮,false为熄灭 * @param bool $a 红灯的状态,true为亮,false为熄灭 * @return bool */ function checkEnterBtn(bool $a, bool $b, bool $c): bool { if ( (!$a && !$b && !$c) || (!$b && $c) || (!$a && $b) || ($a && $b && $c) ) { return true; } return; }
上面的代码是否是以为特别的繁琐。繁琐就对了,下面咱们来开启高能模式,将卡诺图应用到咱们实际的编码中。工具
从上面的四个条件中,咱们能够明显看出,参与逻辑计算的变量只有三个,因此咱们为它们分别定义一个命题:编码
咱们这里使用的卡诺图是变量卡诺图的变种
咱们这里之因此让命题B和命题C交叉的目的是为了覆盖全部的变量。若是只有两个参与运算的变量,卡诺图的机构就是一个4x4的方格。更复杂的卡诺图参见维基百科。spa
接下咱们在知足上面4个条件的方格中打上勾3d
在上面图中,咱们能够一目了然的看出在什么条件下须要按下按钮。接下来,咱们将相邻的打勾格所造成的最大网格用虚线围起来组成组合框(组合框之间能够相互重叠)。code
这个时候,咱们能够看出图中有两个组合框,分别为:blog
将一步得出的两个组合框用代码实现,就是:ip
/** * 判断是否能按下按钮 * @param bool $a 绿灯的状态 * @param bool $b 黄灯的状态 * @param bool $c 红灯的状态 * @return bool */ function checkEnterButton($a, $b, $c) { if (!$a || $c) { // 这里的两个条件就是上一步中两个组合框的内容 return true; } return false; }
固然,并非什么状况都可以使用卡诺图来简化逻辑的,当参与运算的变量过多,会致使卡诺图变得很是的复杂。因此你须要区分什么状况下可以使用这种方式。
好了,到这里就结束了。对比两种实现方式,是否是要简洁不少。因而可知数学对于程序员来讲是多么重要的东西。