卡諾圖是真值表的變形,它能夠將有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; }
固然,並非什麼狀況都可以使用卡諾圖來簡化邏輯的,當參與運算的變量過多,會致使卡諾圖變得很是的複雜。因此你須要區分什麼狀況下可以使用這種方式。
好了,到這裏就結束了。對比兩種實現方式,是否是要簡潔不少。因而可知數學對於程序員來講是多麼重要的東西。