摘要:在部分情況下,卡諾圖能讓你的邏輯變得一目了然,但是如果需要處理的邏輯函數(shù)的自變量較多,卡諾圖會(huì)使圖形更加復(fù)雜。如果只有兩個(gè)參與運(yùn)算的變量,卡諾圖的機(jī)構(gòu)就是一個(gè)的方格。
什么是卡諾圖
卡諾圖是真值表的變形,它可以將有n個(gè)變量的邏輯函數(shù)的2^n個(gè)最小項(xiàng)組織在給定的長(zhǎng)方形表格中,同時(shí)為相鄰最小項(xiàng)(相鄰與項(xiàng))運(yùn)用鄰接律化簡(jiǎn)提供了直觀的圖形工具。在部分情況下,卡諾圖能讓你的邏輯變得一目了然,但是如果需要處理的邏輯函數(shù)的自變量較多,卡諾圖會(huì)使圖形更加復(fù)雜。更多
一個(gè)簡(jiǎn)單的例子現(xiàn)有綠、黃、紅三顆燈,當(dāng)滿足下面四個(gè)條件中任何一個(gè)時(shí),需要按下按鈕:
綠燈、黃燈、紅燈全部都熄滅
黃燈熄滅、紅燈亮
綠燈熄滅、黃燈亮
綠燈、黃燈、紅燈全部亮起
如果讓你寫一段代碼來判斷是需要按下按鈕,很多人會(huì)這么寫:
/** * @param bool $a 綠燈的狀態(tài),true為亮,false為熄滅 * @param bool $a 黃燈的狀態(tài),true為亮,false為熄滅 * @param bool $a 紅燈的狀態(tài),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; }
上面的代碼是不是覺得特別的繁瑣。繁瑣就對(duì)了,下面我們來開啟高能模式,將卡諾圖應(yīng)用到我們實(shí)際的編碼中。
定義命題:從上面的四個(gè)條件中,我們可以明顯看出,參與邏輯計(jì)算的變量只有三個(gè),所以我們?yōu)樗鼈兎謩e定義一個(gè)命題:
命題A: 綠燈亮起
命題B: 黃燈亮起
命題C: 紅燈亮起
畫出卡諾圖的結(jié)構(gòu)我們這里使用的卡諾圖是變量卡諾圖的變種
我們這里之所以讓命題B和命題C交叉的目的是為了覆蓋所有的變量。如果只有兩個(gè)參與運(yùn)算的變量,卡諾圖的機(jī)構(gòu)就是一個(gè)4x4的方格。更復(fù)雜的卡諾圖參見維基百科。
將四個(gè)條件在卡諾圖中標(biāo)出接下我們?cè)跐M足上面4個(gè)條件的方格中打上勾
在上面圖中,我們可以一目了然的看出在什么條件下需要按下按鈕。接下來,我們將相鄰的打勾格所形成的最大網(wǎng)格用虛線圍起來組成組合框(組合框之間可以相互重疊)。
這個(gè)時(shí)候,我們可以看出圖中有兩個(gè)組合框,分別為:
橫向組合框,就是A為false的區(qū)域,因此用?A來表示。
縱向組合框,就是C為true的區(qū)域,因此用C來表示。
實(shí)際代碼將一步得出的兩個(gè)組合框用代碼實(shí)現(xiàn),就是:
/** * 判斷是否能按下按鈕 * @param bool $a 綠燈的狀態(tài) * @param bool $b 黃燈的狀態(tài) * @param bool $c 紅燈的狀態(tài) * @return bool */ function checkEnterButton($a, $b, $c) { if (!$a || $c) { // 這里的兩個(gè)條件就是上一步中兩個(gè)組合框的內(nèi)容 return true; } return false; }總結(jié)
當(dāng)然,并不是什么情況都能夠使用卡諾圖來簡(jiǎn)化邏輯的,當(dāng)參與運(yùn)算的變量過多,會(huì)導(dǎo)致卡諾圖變得非常的復(fù)雜。所以你需要區(qū)分什么情況下能夠使用這種方式。
好了,到這里就結(jié)束了。對(duì)比兩種實(shí)現(xiàn)方式,是不是要簡(jiǎn)潔很多。由此可見數(shù)學(xué)對(duì)于程序員來說是多么重要的東西。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30770.html
摘要:但是,在實(shí)際開發(fā)時(shí)仍然障礙重重。我就曾經(jīng)接受了一個(gè)開發(fā)任務(wù),就是做一個(gè)像劊子手一樣的游戲,但是當(dāng)我看完需求中所有的規(guī)則時(shí),才意識(shí)到要做的應(yīng)該是邪惡的劊子手這是一個(gè)深坑。邊界問題僅在極端最大或最小值參數(shù)的情況下發(fā)生的問題或狀況。 翻譯:瘋狂的技術(shù)宅 作者:Valinda Chan英文標(biāo)題:10 Steps to Solving a Programming Problem英文鏈接:http...
摘要:上圖中,每個(gè)紅圈表示一個(gè)請(qǐng)求,每一層的請(qǐng)求分別是上一層請(qǐng)求的子請(qǐng)求。換而言之,父請(qǐng)求是依賴于子請(qǐng)求的。特別地,的子請(qǐng)求運(yùn)行時(shí),會(huì)阻塞父請(qǐng)求掛起其對(duì)應(yīng)的協(xié)程。 張超:又拍云系統(tǒng)開發(fā)高級(jí)工程師,負(fù)責(zé)又拍云 CDN 平臺(tái)相關(guān)組件的更新及維護(hù)。Github ID: tokers,活躍于 OpenResty 社區(qū)和 Nginx 郵件列表等開源社區(qū),專注于服務(wù)端技術(shù)的研究;曾為 ngx_lua 貢...
摘要:摘要本文我們就如何使用阿里云這樣的配置管理產(chǎn)品在中替代幫助簡(jiǎn)化環(huán)境配置管理做一個(gè)簡(jiǎn)單的示例,幫助你理解基于來簡(jiǎn)化微服務(wù)環(huán)境配置管理的方案,并會(huì)簡(jiǎn)單比較一下與方案的優(yōu)劣。 摘要: 本文我們就如何使用阿里云ACM這樣的配置管理產(chǎn)品在Spring Cloud中替代Spring Cloud Config幫助簡(jiǎn)化環(huán)境配置管理做一個(gè)簡(jiǎn)單的示例,幫助你理解基于ACM來簡(jiǎn)化微服務(wù)環(huán)境配置管理的方案,并...
閱讀 1393·2021-11-24 09:38
閱讀 2095·2021-09-22 15:17
閱讀 2393·2021-09-04 16:41
閱讀 3487·2019-08-30 15:56
閱讀 3520·2019-08-29 17:19
閱讀 1981·2019-08-28 18:09
閱讀 1258·2019-08-26 13:35
閱讀 1718·2019-08-23 17:52