计算机中的递归对普通人有什么启示?
人的思维是自底向上的,而计算机的思维是自顶向下
大家好,我是望京小哥,今天来分享一个计算机中最重要的概念之一——递归。可以说,从计算机被发明到现在,计算机的计算方式一直没有脱离递归的框架。
在说递归之前,需要简单介绍一下递推,递推符合正常人做事情的逻辑,比如打小起我们都先学会1这个数字,然后再是1+1=2,然后推出3、4、5等,突然觉得和《道德经》里面“道生一,一生二,二生三,三生万物”有异曲同工之妙。 人一生下来,都是从小到大,自底而上的思考方法,这恰好和递归是相反的。
那么,什么是递归呢?简单的讲,就是知道5,推出5 =4 +1 = 3+ 1 + 1,刚好是反着来的
用一个例子来说明,斐波那契数列,这是数学家斐波那契提出的一组数,如下:
1,1,2,3,5,8,13,.....
观察这组数的规律,可以发现,从第3项开始,后一个数总是等于前面两个数之和,用一个公式可以概括如下:
f(n) = f(n-1) + f(n-2) , (n>=3)
f(1) = 1, f(2) = 1
这里的f(n)是指第n项的斐波那契数,如果求f(100),按照人的逻辑来计算,就是先求出f(1), f(2),f(3)然后推到f(100), 但是如果是计算机来算,就会以倒推的方式
f100=f99+f98 = f98 + f97 + f97 + f96 = ……
可以明显看出,这是一种自顶向下,反向倒退的方式,这就是递归,最后所有计算的都会落到f(1) = 1, f(2) = 1来计算,然后求和返回。
对计算机来说,这是一个简单的不断重复的过程,它所要做的就是重复这一过程,直到所有的都计算好,恰好计算机就适合做这种机械重复的工作,非常简单,而且速度很快。
与此类似的还有自然语言处理,人在学习一个句子的时候,会先从基本的学习单元开始,先识字,然后组词,然后句子、文章。记得上小学时候学语文经常用的一本参考书就叫做《字词句篇》,讲的就是这个,它符合我们认识世界的习惯。
如果让计算机也这样思考就比较麻烦,计算机最适合做简单重复的工作,当前的计算机是采用自顶向下的语言学习方式,它会将一篇文章拆成句子,比如
句子 = 主语 + 谓语
主语 = 定语 + 名词短语
定语 = 名词短语(或形容词短语), 名词短语 = 形容词 + 名词 (或只有名词) 等等,
它是从上往下嵌套学习的,不断拆分,直到每一个词。这样就识别出了一个句子的内容或者语义。
但是,对人来说,循序渐进的学习是有道理的,就和数字的发展先有较小的数,然后随着人们认知的升级,已有的比较小的数不再满足需要,就会产生更大的数。 但是久而久之,这种自底向上的的思考和学习方式就会限制和固化我们的思考,就不适应自顶向下的做事方式了,而生活中我们常常需要自顶向下的去处理一些事情,即逆向思维,这时候计算机思维就给我们了启发。
递归对学习方法的启示
递归的便利性来自它是一个简单重复的过程,这样可以把一个复杂的问题分解成很多层简单的问题。
人的记忆空间是有限大的,常常会学习了新知识而忘了旧的知识,这时候就需要不断的复习。但是复习的过程中,我们只需记住几个关键点,然后慢慢将知识点串成一条线,一个面,进而掌握。
这个过程的精妙在于,我们先是自底向上的学习,将知识的框架搭起来,这也符合人类的学习习惯。然后复习的过程就是自顶向下了,从一个核心的知识点,引出若干分支知识,每个分支知识又有其各自的内容。这,不就是递归吗?
现在比较流行的思维导图软件,就是在学习完成之后,将知识点以总分的形式进行分拆,然后每个点再分拆,最后达到能知一推二,完成掌握知识的目的。所以更多的时候只有自己做的思维导图比较有意义。别人的可以参考,但是还是达不到掌握的目的。
这里有个例外,就是计算机科学,因为计算机从设计伊始就采用自顶向下的设计方式,从计算方式,数据结构,架构设计,更多的适合自顶向下来学习,这样也可以避免一开始对基本概念不感兴趣产生的乏味感,导致从入门到放弃。
好的工程师应该有较好的自顶向下的学习能力,并且也应该有能hold住大规模代码的能力。而这种能力就要求一开始对程序的设计必须是自顶向下的,这里需要仔细品。
递归对管理,人生的启示
递归对学习的启示是比较重要的,但是对于另一些方面,个人做事,人生管理上面也有一些可以借鉴的地方。
就个人做事来讲,每一件事就是一个小项目,如果给一个项目5个月时间来完成,一共分为5步,如果我们正向思考,经常会陷入大学交作业,交论文的窘迫,开始时间不好好珍惜,觉得还有大把的时间,所以可以不着急,然后到了期限将至,着急了起来,最后既不保质也不保量。
管理学上通常要求倒推,即用自顶向下的方式来管理一个项目。如果项目分为5步,最后一步需要1个月,那么前四步就必须在第五个月前完成,这样一步一步倒推,然后严格按照时间表完成,这样每一件事都有很好的开始和结果。
有时候我们在倒推的时候发现,事情太多做不完,那么就必须做删减,然后挑出最重要的事去做。这也从另一个角度告诉我们,少即是多。我自己就是一个反例,常常会列出很多事,然后想着后面去做,最后总是忙忙碌碌,都没做好。
更进一步,将项目管理升华到我们的人生管理,我们也应该自顶向下的规划,即向死而生。我们普通人思考的人生,常常是从当下往后看,明天做什么,明年做什么等等,这样到头来可能碌碌无为。
反向思考,自己一生中必须要做的事情是什么,为了完成这件事情,需要做什么准备,逐级倒推,就可以想到我们目前要做最重要的是什么了。
以上,是对递归的一些思考,予以分享。
版权声明: 本文为 InfoQ 作者【BitSea】的原创文章。
原文链接:【http://xie.infoq.cn/article/ea045d5c304b7297dd9d6667f】。文章转载请联系作者。
评论 (2 条评论)