目录(点击切换)
本文节选自《计算之魂》电子版:
/第2章/儿逆向思考一一从递推到递归1/个乘起来,即5S!=1X2X3X4X5。当我们学会计算5!之后,举一反三,就会算100!了,即从上乘到100。在生活中这种想法和做法非常自然、合理,我们从来不觉得有什么问题。那么如果用递归的思维怎样计算阶乘呢?它要把上述过程倒过来。比如要算5!,先假定4!是已知的,再乘以5即可。当然,大家会问,那4!怎么算呢?很简单,采用同样的方法,把它变成3!X4。至于3!,则用同样的方法处理。最后做到1!时,我们知道它就等于1,至此不再往下扩展了。接下来,就是倒推回所有的结果,从1!、21!一直倒推回5!。递归的思想有两个明显的妙处。第一个妙处是只要解决当前一步的问题,就能解决全部的问题。比如计算阶乘N!时,只要关心Y乘以某一个数就可以了,所乘的那个数字,则是N-!1的阶乘(W-D)!。至于(MD!怎么计算,复制同一个过程即可,这便是它的第二个妙处。当然,这里面有两个前提条件:首先,每一个问题在形式上都是相同的,否则无法通过同一个过程完成不同阶段的计算;其次,必须确定好结束条件,否则就像“从前有座山”那个故事里的情节,永远结束不了。很多人在学计算机课程时非常不喜欢递归这种不直观的逆向思维,觉得像阶乘运算这种从小到大一个个相乘就可以了,何必那么复杂地倒着计算呢?原因很简单,很多问题只有
吴军 计算之魂电子版
倒着才能想清楚。这一关如果过不了,在计算机领域做一辈子技术也出不了师,这就如同开车的人不会使用后视镜永远拿不到驾照一样。为了进一步说明这种逆向思维的重要性,我们不妨再来看一个例子。2.1.1看似简单的递推公式例题21抢20(AB)食禽你和一位对手来做一个游戏。你们其中的一个人先从1和2中挑一个数字,另一个人则在对方的基础上选择加1或者加2。然后又轮到先前的人,你或者他可以再次选择加1或者加2。之后双方交替地选择加上或者加2,谁正好加到20,谁就赢了。你用什么策略保证一定能总?063//计算之奸1/这个问题如果从小往大去考虑,多少有点难度。如果改成抢5,那就非常简单了,因为我们可以把各种可能性考虑清楚。如果是抢10,从小往大一步步推,那就有点复杂了。对于抢20,情况就更复杂了。因此,这一类问题很难通过列举各种情况来解决。但是,如果我们倒过来想这个问题,它就变得非常简单了。要想抢到20,就需要抢到17,因为抢到了17之后,无论对方是加1还是加2,你都可以加到20。而要想抢到17,就要抢到14,以此类推,就必须抢到11、8、5和2。因此对于这道题,只要你先说出2,你就赢定了。这便是递归的思想。顺着这个思路想问题,无论是抢30还是抢50,都可以这样处理。这里面最核心的地方在于,要看清楚无论对方选择1还是2,你都可以控制
计算之魂 吴军电子书
每一轮两人喊出的数字总和为3,从而就可以牢牢控制整个过程了。我的一些同事和朋友用这个问题做过面试题,让我们吃惊的是,面试Google的人居然有三成答不上来。那些答不上这个问题的人,无一例外地还在用从小到大递推归纳的方式想问题,他们会先从抢2、抢3、抢4开始,逐一列举各种情况,试图找到一个递推的公式。透过这种做法,能看出他们即便能够使用编程的手段解决一些问题,但完全没有领会计算机科学的精岩。他们如果在思维方式上过不了这一闫,只能在五级工程师的水平徘徊,从业时间再长,层级都提升不上去。当然,上面这道例题还太简单,以至于还是有人可能从小往大一点点总结经验把它做出来,但我们把它稍微变一下就会复杂不少。接下来我们来看看例题2.1的变种。例题2.2”上台阶问题(AB、FB等)会俩俩市-按照例题2.1的方法,从1工开始〔以1为起点)加到20,每次可以增加1或者2,有多少种不同的增加方法?比如1、4、7、10、12、15、18、20是一种,1、2、5、8、11、14、17、20又是一种(列举的数字为其中的关键步,非每次增加后的台阶数)。我们想知道这样不同的过程有多少种。这个问题也被称为上台阶问题,也就是每次登一级或者两级台阶,登到20级有多少种走法。我和我的一些同事在面试时问过面试者这个问题,大约有一半的人答不上来。063
计算之魂 mobi下载
| 计算之魂摘抄 | 计算之魂 epub |
| 计算之魂内容简介 | 吴军 计算之魂 mobi |
| 计算之魂思考题答案 | 计算之魂作者 |
综上:计算之魂吴军电子书值得推荐阅读

评论已关闭!