编程珠玑-从数据出发改善程序

源自《编程珠玑》第 2 版第 3 章,《数据决定程序结构》

引子

为了统计 500 个变量各自出现的频次,你编写了下面这段代码,被同事笑死:

1
2
3
4
if (k == 1) c001++;
if (k == 2) c002++;
// if (k == ...
if (k == 500) c500++;

同事说,“你是不知道有数组这个东西嘛?用一个含有 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$。

不用数组又如何实现?

编程珠玑-从数据出发改善程序

https://xlindo.com/kewenlu2022/posts/5e4dda24/

Author

xlindo

Posted on

2021-12-22

Updated on

2023-05-10

Licensed under

Comments