这几日在看SICP, 瞬间被其简洁表示方式所触动, 突然想起以前看到的一句话, 理论家一直在寻找一种概念最简洁的定义方式, 他们发明概念, 不断修剪, 直到这个理论简单的不能再精简为止. SICP中的list就是这样的一种概念. 我一直在想, 当初的设计者是为何会想到用序对来表述数组这一概念的? 今天, 就容我揣摩下.
首先我想到的是, 自然数的定义:
0是最小的自然数.
每一个自然数n都有一个后续者n+1, 其中n+1也是自然数.
多么简洁的定义! 不由得让人想到了递归, 0是类似于递归出口的东西. 而n的后继为n+1正式递归的逆向-迭代. 他可以采取顺推的方式求得一个自然数.
想起以前看到文章里的一句调侃递归的话: 人理解迭代, 神理解递归. 为何人的思维是天生理解迭代的呢, 举一个例子, 小时候上学 顽皮, 老是都是怎么惩罚学生的? ->把这首诗抄500遍. 于是乎听话的学生就开始抄了, 第一遍, 第二遍.....直到数到第500遍为止. 丧心病狂! 但是为什么我们不是逆向去数的呢, 如果一个孩子的思维是这样的, 我要抄500遍对吧, 我从结果出发, 500遍是个大工程, 那我先把第500次给写好, 然后再去解决前面的499遍, 这样问题的规模就小了 , 以此类推. 但是很少有这样思维的小朋友.
说了这么多废话, 那么我就猜猜大师是为何会想到序对来定义数组呢, 首先 ,大师们对递归都有非常深的理解. 然后数组是不是可以这样定义:
最小的数组是空集
每一个数组list(n)在添加了一个新的元素之后, 会变成一个长度为n+1的数组list(n+1)
是不是和自然数的定义很像?
那么如何推导出数组的最简单表示形式, 我们可以把一个长度为n的数组看成一个整体, 记为p, 新元素为q, 那么新的数组就是(p, q) 而p的定义也不晓得, 好吧, 那我们就逆推p= (m ,o)其中o也是一个整体, 此时((m,o) q) 以此类推. 是不是发现组成数组的最基本元素-序对自然而然的出来了呢.
如果经常用这种思维方式去探索事务的本质(最简形式),那么一旦训练出这种思维方式, 我们会不会高人一等呢?