化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件
来源:互联网 发布:网络yy价格 编辑:程序博客网 时间:2024/05/16 00:59
《化简复杂逻辑,编写紧凑的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=false,化简!b && c || a && c。用法1,得(! a && b) || c。又!a && b=false,最后得c。
已知!a && b = c = false,化简a && !c || !b && !c。得True。
现在代码可以优化成
if (!a && b && d) { //立即跃迁 } else if (!a && b) { //可以跃迁但跳跃门附近有船。 //为避免撞船,等待一会儿 } else if (c) { //老老实实飞过去 } else//a && !c || !b && !c { //异常 }
还有个问题。if条件的先后顺序影响了语句的化简结果。什么样的顺序才能得出最简表达呢?
- 化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件
- 化简复杂逻辑,编写紧凑的if条件语句(三):确定最简的if子句顺序
- 化简复杂逻辑,编写紧凑的if条件语句
- c#条件结构(二)----if语句
- python的条件分支语句(if)
- 关于if语句的条件
- shell条件嵌套(if条件语句)
- shell条件嵌套(if条件语句)
- javascript中if语句条件执行顺序
- 复杂条件的if选择结构
- if 语句条件修饰词
- if条件语句
- 022.If 条件语句
- 022.If 条件语句
- 条件选择语句 if
- 条件编译#if语句
- linux if条件语句
- if条件语句
- Linux 2.6内核与Linux 3.0 的区别!
- 利用Debian定制适合自己的系统
- jquery checkBox全选及取消全选
- Yii中validator之scenario 场景
- js函数集
- 化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件
- 内存管理
- 定制debian
- android surfaceflinger研究----显示系统
- lua,安装readline库后,zypper报zypper: symbol lookup error: /usr/local/lib/libreadline.so.6: undefined symb
- 关于并行SSH运行命令和文件复制的一些总结
- hashing 与 bloom filter
- NAT的完全分析及其UDP穿透的完全解决方案
- Servlet 中文乱码问题及解决方案剖析