编程珠玑-从数据出发改善程序
源自《编程珠玑》第 2 版第 3 章,《数据决定程序结构》
引子
为了统计 500 个变量各自出现的频次,你编写了下面这段代码,被同事笑死:
1 | if (k == 1) c001++; |
同事说,“你是不知道有数组这个东西嘛?用一个含有 500 个元素的数组,你这个代码可以从 500 行减到 10 行以内!”
其实这就是章节标题的含义——利用合理的数据结构、类型去思考程序的设计,将有可能获得诸多益处:
- 程序更简短
- 程序运行的时间、空间上更高效
- Debug 更一览无余
做法
总的来说,可以从以下几点入手考虑:
- 通常可以看看有没有数据可以被组装成数组
- 用类去封装复杂的结构、操作
- 这既可以是抽象化的面向对象
- 也可以仅仅是将数据组织为一个新的类型
- 尽可能地使用高级概念:
- HTML:使用类似模板(非 C++ 模板)的方法,将多组数据填到统一的文本中去展示,这避免了单次的手动打印所有信息
- 键值对:进一步约定了模板变量的类型
- 数据库或电子表格:将数据和操作标准化,交给专业工具
- 特定领域的编程语言:用 Python 做机器学习,R 做数据分析都是很好的例子,用 Tcl 做脚本等等
最终,在更优良的数据结构上设计程序。
作业
编写一个解决第 23 种情况的程序比较困难;编写一个通用的程序,然后令 $n=23$ 可能更简单
$k$ 阶常系数线性递归定义的级数为:
$$
a_n = c_1 a_{n-1} + c_2 a_{n-2} + \cdots + c_k a_{n-k} + c_{k+1}
$$
其中,$c_1, \cdots, c_{k+1}$ 为实数。
编写程序,输入 $k, a_1, \cdots, a_k, c_1, \cdots, c_{k+1}, m$,输出 $a_1, \cdots, a_m$。
不用数组又如何实现?
编程珠玑-从数据出发改善程序