使用卡諾圖簡化你的邏輯判斷

什麼是卡諾圖

卡諾圖是真值表的變形,它能夠將有n個變量的邏輯函數的2^n個最小項組織在給定的長方形表格中,同時爲相鄰最小項(相鄰與項)運用鄰接律化簡提供了直觀的圖形工具。在部分狀況下,卡諾圖能讓你的邏輯變得一目瞭然,可是若是須要處理的邏輯函數的自變量較多,卡諾圖會使圖形更加複雜。更多php

一個簡單的例子

現有綠、黃、紅三顆燈,當知足下面四個條件中任何一個時,須要按下按鈕:程序員

  1. 綠燈、黃燈、紅燈所有都熄滅
  2. 黃燈熄滅、紅燈亮
  3. 綠燈熄滅、黃燈亮
  4. 綠燈、黃燈、紅燈所有亮起

若是讓你寫一段代碼來判斷是須要按下按鈕,不少人會這麼寫:函數

/**
 * @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;
}

上面的代碼是否是以爲特別的繁瑣。繁瑣就對了,下面咱們來開啓高能模式,將卡諾圖應用到咱們實際的編碼中。工具

定義命題:

從上面的四個條件中,咱們能夠明顯看出,參與邏輯計算的變量只有三個,因此咱們爲它們分別定義一個命題:編碼

  • 命題A: 綠燈亮起
  • 命題B: 黃燈亮起
  • 命題C: 紅燈亮起

畫出卡諾圖的結構

咱們這裏使用的卡諾圖是變量卡諾圖的變種

image

咱們這裏之因此讓命題B和命題C交叉的目的是爲了覆蓋全部的變量。若是隻有兩個參與運算的變量,卡諾圖的機構就是一個4x4的方格。更復雜的卡諾圖參見維基百科spa

將四個條件在卡諾圖中標出

接下咱們在知足上面4個條件的方格中打上勾3d

image

在上面圖中,咱們能夠一目瞭然的看出在什麼條件下須要按下按鈕。接下來,咱們將相鄰的打勾格所造成的最大網格用虛線圍起來組成組合框(組合框之間能夠相互重疊)。code

image

這個時候,咱們能夠看出圖中有兩個組合框,分別爲:blog

  • 橫向組合框,就是A爲false的區域,所以用¬A來表示。
  • 縱向組合框,就是C爲true的區域,所以用C來表示。

實際代碼

將一步得出的兩個組合框用代碼實現,就是:ip

/**
 * 判斷是否能按下按鈕
 * @param bool $a 綠燈的狀態
 * @param bool $b 黃燈的狀態
 * @param bool $c 紅燈的狀態
 * @return bool 
 */
function checkEnterButton($a, $b, $c) {
    if (!$a || $c) {        // 這裏的兩個條件就是上一步中兩個組合框的內容
        return true;
    }

    return false;
}

總結

固然,並非什麼狀況都可以使用卡諾圖來簡化邏輯的,當參與運算的變量過多,會致使卡諾圖變得很是的複雜。因此你須要區分什麼狀況下可以使用這種方式。

好了,到這裏就結束了。對比兩種實現方式,是否是要簡潔不少。因而可知數學對於程序員來講是多麼重要的東西。

相關文章
相關標籤/搜索