假如你的同事写了这样的代码:a && d || b && c && !d || (!a || !b) && c

假设看到了这样的代码:javascript

if (a && d || b && c && !d || (!a || !b) && c) {
  console.log('pass')
} else {
  console.log('fail')
}
复制代码

你是否一口老血喷在屏幕上?java

固然,这段代码是我参考一个沸点(@隔壁村的李二狗)伪造的,希望你和你的同事都别这么写。canvas

能写出这种与或非,若是不是逻辑不清,那么估计只有一种可能,需求变动不少次,多人修改后的结果。。微信

如今的问题是,面对如此代码,这么复杂的逻辑,可否优化?优化

答案是确定的!动画

这种问题的探究来自于一门数学:布尔代数或逻辑代数。ui

说到布尔,咱们开发者对此太熟悉了。不就是 true 和 false 嘛。spa

布尔代数这门课,大学里应该或多或少都讲些吧。由于我是数学专业毕业的,看到这种问题必须记录一下,也顺便复习一下。code

为了方便表达,JS中的与或非,我用布尔代数里面的表示方法(感谢掘金支持latex公式):cdn

a\&\&b \Rightarrow AB

a||b \Rightarrow A+B

!a \Rightarrow \overline{A}

所以 a && d || b && c && !d || (!a || !b) && c 能够表达为:

AD+BC\overline{D}+(\overline{A}+\overline{B})C

转化后优先级清晰多了。

如今的问题是,咱们如何化简这个逻辑表达式。

还好有一些经常使用结论可供咱们使用:

  1. A+A=A、A+\overline{A}=1

  2. AB+A\overline{B}=A

  3. A+AB=A

  4. \overline{A}+\overline{B}=\overline{AB}、\overline{A}\overline{B}=\overline{A+B}

  5. AB+\overline{A}C=AB+\overline{A}C+BC

前四个公式很好理解。好比A+\overline{A}=1,本身或上本身否,固然为 true。

关键在于第5个公式没那么直观,能够经过画图简单说明下(其余公式均可以相似推导)。

首先看AB部分,如图中绿色区域:

再看\overline{A}C,如图中绿色区域:

则两者之和为:

BC部分正是图中粉色区域:

由于粉色区域本来就在前两者之和里面,所以加多少BC次都是同样的。

注意最后这个公式核心特色:A\overline{A}是以和出现的。

有了这几个公式做为铺垫,咱们就能够正式推导了(原沸点配图中有):

AD+BC\overline{D}+(\overline{A}+\overline{B})C

根据第4条,替换最后一项:

AD+BC\overline{D}+\overline{AB}C

注意到前两项分别有D\overline{D},符合第5条:

AD+BC\overline{D}+ABC+\overline{AB}C

此时最后两项,符合第2条:

AD+BC\overline{D}+C

最后两项知足第3条:

AD+C

至此化简完了。真是不能够思议,B没了!

此时开篇的代码简化成了这样:

if (a && d || c) {
  console.log('pass')
} else {
  console.log('fail')
}
复制代码

真清爽。

点击验证两者等价性

感谢你看到这里,但愿有所帮助。

今年年底,本人立了个flag,2020年要研究透canvas动画技术。

图中二维码是个人惟一微信号,若有掘友想加的,麻烦备注下来源哈,好比【掘金】。

本文完。

相关文章
相关标签/搜索