前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >'24点'编码小感

'24点'编码小感

作者头像
用户2615200
发布2018-08-02 17:42:14
5560
发布2018-08-02 17:42:14
举报
文章被收录于专栏:tkokof 的技术,小趣及杂念

此处的’24点’并不指午夜,而是一种游戏~

引子

之前看到了一道四则运算相关的程序题,遂而想到了24点游戏,觉得有趣,就想自己随手编写了一个,起初觉得应该比较简单,但实际的路途却并不平坦~

过程

最开始要解决的就是算式的求解问题(输入字符串形式的四则算式,返回算式结果),对于很多脚本语言,都有内建的机制可以使用: 譬如 JS 中 eval, Lua 中的 load 等等,不过还是自己编码开发一下更有趣味些,所以使用传统的双栈(操作数栈和运算符栈)算法实现了一番,这里有了第一点感悟:

  • 虽然可以完成基本的四则运算功能,但双栈算法却缺乏错误检测和处理的能力,目前的实现中,对于某些非法输入(譬如”6+(4-13-)9”),仍然可以正常运算并返回结果
  • 双栈算法的局限性也很大,功能扩展比较困难(譬如扩展支持数学函数)
  • 更好的做法还是需要使用语法分析

可以解析求解四则运算之后,接下来的工作就是24点游戏的”业务逻辑”了,首先要解决的一个问题是: 给定四个数字,判断是否可以计算得到24(每个数字使用一次并仅使用一次)

穷举四个数字间所有的四则运算方式就可以解决这个问题,由于问题规模较小,一般我们手写几个嵌套循环就能完成枚举,但是自己还是尝试一般化了这里的穷举逻辑,于是有了第二点感悟:

  • 一般化的生成代码往往需要涉及递归相关逻辑,就目前的实现而言,由于不想存储中间结果,我还不得不在递归中加入了回调
  • 就24点而言,四则运算的穷举包括两个部分:运算数字间的排列以及运算符的添加(包括可能的括号),导致目前的实现中产生了递归中的双重回调(回调中包含回调)
  • 虽然通用化的代码扩展性更好,但是条件允许的情况下,还是建议采取更简单的特定化实现~

编码过程中还出现了不少之前没有预料到的问题:

  • 除零错误
  • 算式生成涉及大量字符串操作,繁琐且容易出错
  • 游戏逻辑因为需求的原因,很难去除耦合,分离接口

没想小小一个游戏,却能折射出这么多软件工程的问题,这里有了第三点感悟:

  • 无论项目大小,始终对编程保持敬畏之心吧~

最后让我们来做做脑部体操,自己来算个24点吧:

11 3 12 5

(什么?算不出24点?那就自己编个程序帮你算吧~)

  • gist上自己使用双栈算法实现的四则运算代码
  • 这里有一篇关于双栈算法的描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年07月17日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引子
  • 过程
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档