化简复杂逻辑,编写紧凑的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子句顺序化简条件的更多相关文章

  1. 化简复杂逻辑,编写紧凑的if条件语句

    当业务逻辑很复杂,涉及多个条件的真假,或者多种条件下都会执行同一动作时,如何编写紧凑的if语句呢?本文借由一个实际例子,利用数学的布尔逻辑整理条件,最终产生if语句. 问题 在<X3 重聚> ...

  2. controller层负责创建类传递类给service;service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性;dao层负责数据的持久化

    controller层负责创建类传递类给service:service层负责逻辑编写调用dao层 将编写后的类传递到dao层,保证事务的正确性:dao层负责数据的持久化

  3. 关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  4. UFLDL深度学习笔记 (二)SoftMax 回归(矩阵化推导)

    UFLDL深度学习笔记 (二)Softmax 回归 本文为学习"UFLDL Softmax回归"的笔记与代码实现,文中略过了对代价函数求偏导的过程,本篇笔记主要补充求偏导步骤的详细 ...

  5. 【转】关于大型网站技术演进的思考(二十一)--网站静态化处理—web前端优化—下【终篇】(13)

    本篇继续web前端优化的讨论,开始我先讲个我所知道的一个故事,有家大型的企业顺应时代发展的潮流开始投身于互联网行业了,它们为此专门设立了一个事业部,不过该企业把这个事业部里的人事成本,系统运维成本特别 ...

  6. 编写高质量代码改善C#程序的157个建议——建议104:用多态代替条件语句

    建议104:用多态代替条件语句 假设要开发一个自动驾驶系统.在设计之初,此自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand { Start, Stop } 当前该枚举存 ...

  7. WPF系列教程——(二)使用Prism实现MVVM设计模式 - 简书

    原文:WPF系列教程--(二)使用Prism实现MVVM设计模式 - 简书 本文假设你已经知道MVVM设计模式是什么,所以直接进入正题,今天我们就用Prism来实现WPF的MVVM设计模式,百度上关于 ...

  8. 第二步:将LAD结果的属性值二(多)值化,投入计算模型

    一文详解LDA主题模型 - 达观数据 - SegmentFault 思否 https://segmentfault.com/a/1190000012215533 SELECT COUNT(1) FRO ...

  9. JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道

    上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...

随机推荐

  1. 关于NGINX下开启PHP-FPM 输出PHP错误日志的设置(已解决)

    最近在本地搭建的LNMP的开发环境.为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php.ini中的一些错误提示.但是这样一来,就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题. n ...

  2. 关于yii2的gridview关联搜索步骤

    在使用yii2构建搜索视图,经常都会使用到gridview这个组件,这个组件十分强大,通过一定的配置就能进行关联搜索,下面就是简单的步骤 需求场景:一个车系表,里面存放在品牌表的id,现在要用品牌名字 ...

  3. silverlight依赖属性

    依赖属性(Dependency Property)和附加属性(Attached Property) 参考 http://www.cnblogs.com/KevinYang/archive/2010/0 ...

  4. CSS自学笔记(7):CSS定位

    很多时候,我们需要对一些元素进行自定义排序.布局等,这是就需要用到CSS的定位属性了,用这些属性对一些元素进行自定义排序.布局等操作,可以改变浏览器默认的死板的排序. CSS定位的功能很容易理解,它允 ...

  5. Python自动化环境搭建

    安装配置 Eclipse + PyDev + Robotframework 集成开发环境 1.安装JDK安装目录下的jdk-7u17-windows-i586.exe文件(JAVA开发.运行环境)安装 ...

  6. 不显示BOM清单的版本

    应用 Oracle Bill Of   Materiel 层 Level Function 函数名 Funcgtion Name BOM_BOMFDBOM 表单名 Form Name BOMFDBOM ...

  7. 在 Windows Azure 虚拟机中使用 Microsoft SQL Server 安全功能

    编辑人员注释:本文章由 SQL Server 团队高级项目经理 Sung Hsueh 撰写. SQL Server 的最新用法之一是利用 Microsoft 的 Windows Azure 基础结构服 ...

  8. C# MVC 自学笔记—6 编辑方法和编辑视图

    ==============================翻译============================== 运行该应用程序并浏览到Movies控制器通过将/Movies追加到您的浏览 ...

  9. 布线问题(prime)

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...

  10. winds引导配置数据文件包含的os项目无效

    我装了winds7与linux双系统,用easyBcd程序时,删除了一个winds7,之后winds7就进不去了, 进入winds7时显示winds未能启动,原因可能是最近更改了硬件或软件.解决此问题 ...