第一章 计数的启发
对我们视为理所当然的事情,反思其背后的逻辑,并提炼出相应的方法论。对问题的理解,实现由“形而下”到“形而上”的跨越。
1.1 从n进制到按位计数
用n进制表示x的操作是:将x表示成对基 { . . , n − 2 , n − 1 , n 0 , n 1 , n 2 , . . . } \{.., n^{-2},n^{-1}, n^0, n^1, n^2, ...\} {..,n−2,n−1,n0,n1,n2,...}的线性组合。
其中,引出一个问题,如何理解 n i n^i ni ?
- 常见的理解是 i个n相乘。
- 但是这种理解无法推广到 i ≤ 0 i\leq 0 i≤0的情况。
为了解决这个尴尬的问题,换个思路理解
n
i
n^i
ni。
即,
n
i
n^i
ni 是
n
i
+
1
n^{i+1}
ni+1的
1
n
\frac{1}{n}
n1倍。也就是
n
i
=
n
i
+
1
×
1
n
n^{i} = n^{i+1}\times \frac{1}{n}
ni=ni+1×n1
也就是通过使用相邻两项之间的递推关系来理解
n
i
n^i
ni。使用邻项之间的递推关系,在程序设计中非常常见。
而按位计数指的就是,数中的每一位上的数字对应的就是相应基的系数。例如:
(
707
)
10
(707)_{10}
(707)10
表示的意思是,
707 = 7 × 1 0 2 + 0 × 1 0 1 + 7 × 1 0 0 707 = 7\times 10^2 +0\times 10^1 + 7\times 10^0 707=7×102+0×101+7×100
1.2 数字0的作用:为按位计数服务
小学的数学教育肯定会告诉学生,0是人类最伟大的发明。但是,如果对其继续追问,为什么伟大?估计想要说的非常清楚,还是有一丢丢难度的。
由按位计数中0的作用。作者给出的答案是:
- 占位。 ( 707 ) 10 (707)_{10} (707)10中间的0表示,707中没有 1 0 1 10^1 101成分。但是因为按位计数,数字的每一位都是有意义的,所以这里的0没法省略。
- 统一模式。在基的部分, n 0 n^0 n0,正好是 { . . , n − 2 , n − 1 , n 0 , n 1 , n 2 , . . . } \{.., n^{-2},n^{-1}, n^0, n^1, n^2, ...\} {..,n−2,n−1,n0,n1,n2,...}中每个元素都保持 n i n^i ni的模式。
我的理解是: 0 就是为了按位计数服务的。如果没有按位计数的想法,0的存在也就失去了大部分的意义。
1.3 对按位计数的深入思考
人类在解决计数所面临的核心问题是,如何更简单的计数?
先看看按位计数为什么更简单?
将问题具体化,对于数“十二”, 用罗马数字“XII”,比用“IIIIIIIIIIII”方便,而12比罗马数字方便。如何看待按位计数12这种方便?
**将大问题分解为多个相互独立的小问题。**这个再按位计数的12上的体就是,将数“十二”分解为两个十进制位来表示:十位与个位,每一位上都使用0~9十个数来表示。然后,两个进制位上数字组合起来表示的就是“十二”。在程序设计中,经常会使用的“分治”就是这种思想。
但是随着社会发展,人类接触的计数的数字越来越大,而按位计数在表示大数方面,有很多不便。例如:很难一眼区分 1000000与100000的大小关系。于是就有了,我们小学课本中所学的科学计数法。 1 0 6 10^6 106和 1 0 5 10^5 105。
继续追问,在大数计数上,科学计数法为什么比按位计数更简单?
回到1000000与100000,光是比较零的个数就可以区分它俩的大小关系。科学计数法就是着眼于此。也就是说,数零的个数是区分大数的核心关切。
书中将科学计数法命名为“指数计数法”。
1.4 小节
按位计数的历史发展进程:从结绳计数一般的符号计数,到不同进制下的按位计数,再到指数法计数。这个过程能给我们分析和解决大规模问题的启示是:对于规模较大的问题使用“分治”的思想,即分成多个相互独立的小问题,各个击破。