化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件
《化简复杂逻辑,编写紧凑的if条件语句》已经得出了跳、等、飞、异常的各自条件,方便起见这里重新贴一下。
- 立即跃迁:!a && b && d
- 等待跃迁:!a && b && !d
- 飞往星区:!b && c || a && c
- 抛出异常:a && !c || !b && !c
这四个条件已经是“全集”了,或起来等于True。
按照跳、等、飞、异常的顺序写if-else if-...else-end语句,则是这样的:
if (!a && b && d)
{
//立即跃迁
}
else if (!a && b && !d)
{
//可以跃迁但跳跃门附近有船。
//为避免撞船,等待一会儿
}
else if (!b && c || a && c)
{
//老老实实飞过去
}
else//a && !c || !b && !c
{
//异常
}
可以发现,第一第二句if里,!a && b 是重复的。大多数人可能希望把它改成嵌套的if。
if (!a && b)
{
if (d)
{
//立即跃迁
}
else//!d
{
//可以跃迁但跳跃门附近有船。
//为避免撞船,等待一会儿
}
}
这种方法诚然可行,但它是基于开发人员的直觉或经验,不是数学上的推导。当条件复杂时,人们就会晕头转向了。
问题
我这里使用正规的数学方法化简第二句if。把程序问题转化为数学问题,就是:已知!a && b && d=false,化简!a && b && !d。
解答(法1)
解决此类问题的一般方法是代入法。
用Mathematica的话还是用BooleanMinimize方法。
问题的等价表述
还有另一种数学表述:已知是个永真式,求解z。这个式子的意思是在x && y==false的情况下, x && !y与z总是给出相同的值。
解答(法2)
先把式子化简,并变换为合取范式。
Mathematica 7.0里⇔符号似乎在Basic Math Assistant窗口里没有,要用ESC equivESC打出。
尽量使z出现的次数减少,再手工变换一下。
如果要使其为永真式,则左右两个括号里都得是永真式。在左边配一下,z可以等于或
;在右边配一下,z可以等于
。所以,z等于
。
这个方法疑似比较难凑。
化简if条件
已知!a && b && d = false,化简!a && b && !d。刚才已经算过了,得!a && b。
已知!a && b && d=!a && b && !d=false,化简!b && c || a && c。用法1,得(! a && b) || c。(似乎并没有简单多少)
已知!a && b && d=!a && b && !d=!b && c || a && c=false,化简a && !c || !b && !c。得True。
现在代码可以优化成
if (!a && b && d)
{
//立即跃迁
}
else if (!a && b)
{
//可以跃迁但跳跃门附近有船。
//为避免撞船,等待一会儿
}
else if ((!a && b)|| c)
{
//老老实实飞过去
}
else//a && !c || !b && !c
{
//异常
}
还有个问题。if条件的先后顺序影响了语句的化简结果。什么样的顺序才能得出最简表达呢?
化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件的更多相关文章
- 化简复杂逻辑,编写紧凑的if条件语句
当业务逻辑很复杂,涉及多个条件的真假,或者多种条件下都会执行同一动作时,如何编写紧凑的if语句呢?本文借由一个实际例子,利用数学的布尔逻辑整理条件,最终产生if语句. 问题 在<X3 重聚> ...
- controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化
controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化
- 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...
- UFLDL深度学习笔记 (二)SoftMax 回归(矩阵化推导)
UFLDL深度学习笔记 (二)Softmax 回归 本文为学习"UFLDL Softmax回归"的笔记与代码实现,文中略过了对代价函数求偏导的过程,本篇笔记主要补充求偏导步骤的详细 ...
- 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)
本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...
- 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句
建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存 ...
- WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书
原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...
- 第二步:将LAD结果的属性值二(多)值化,投入计算模型
一文详解LDA主题模型 - 达观数据 - SegmentFault 思否 https://segmentfault.com/a/1190000012215533 SELECT COUNT(1) FRO ...
- JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道
上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...
随机推荐
- Cent OS 修改网卡配置
进入网卡修改界面 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 描述网卡设备名称 BOOTPROTO=static 静态IP,这里一 ...
- 对于一些css样式的巧妙方法进行总结。
针对之前遇到过的一些特殊样式的实现,我今天做个总结,目的有二:一是将这些方法记录下来,以便将来需要用到时查找使用.二为将这些大神们智慧的结晶发扬光大,让广大前端程序猿们能够少走弯路.此贴为更新帖,以后 ...
- php curl函数实例
<?php function login(){ $url = 'http://jspatch.qq.com/offline/check?qver=6.2.0.427&hver=0& ...
- jquery判断图片是否加载完毕
来源: <http://www.2cto.com/kf/201409/331234.html> 利用图片没有加载完成的时候,宽高为0.我们很容易判断图片的一个加载情况.如下: 思路:判断图 ...
- Android SQLiteDatabase使用总结
SQLiteDatabase数据库操作 1.创建一个继承了类SQLiteOPenHelper类复写相应的方法,和构造函数 2.然后创建一个类,定义一个私有变量(上述类的实例化对象),在构造函数中进行初 ...
- private、 protected、 public、 internal 修饰符的访问权限
private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 当前程 ...
- 未能从文本"Template"创建 "System.Windows.DependencyProperty"
XXXXProperty = DependencyProperty.Register("XXXX", typeof(double), typeof(MyClass), new Pr ...
- 解决Robotium测试用例crash问题
今天遇到一个棘手的问题 用robotium框架真机测试客户端时 跑到一半会crash 搜了一堆资料终于解决了 我的程序引起crash主要原因有两个: 1.用Robotium测试框架跑多个用例(写在同一 ...
- C++中的句柄类
初次在<C++ Primer>看到句柄,不是特别理解.在搜索相关资料后,终于有了点头绪. 首先明白句柄要解决什么问题.参考文章<C++ 沉思录>阅读笔记——代理类 场景: 我们 ...
- css3幻灯片换位效果
<title>css3幻灯片换位效果</title> <style type="text/css"> .flowGallery {width: ...