谷歌有一道面试题:
我们两个人一起做一个游戏。第一个人先从1和2中挑一个数字,第二个人可以在对方基础上选择加1,或加2。然后又轮到第一个人,他可以再次选择加1,或加2,之后把选择权交给对方。就这样双方交替选择加1或者加2,谁要是正好加到20,谁就赢了。用什么策略保证一定赢?
为了方便你理解,我们来举个例子。以谁加到10谁就赢来举例。
假如我让你先选,你选择加2,我选加2到4,然后你选加1到5,我还选加2到7。接下来,不论你选加1到8,还是加2到9,我都能加到10,因此我赢定了。当然,你可能觉得先选的人比较吃亏,这次换我先选。我选择1,你可能选择加2到3,然后我选择加1到4。接下来,假如你选择加2到6,我会选择加1到7,这又回到第一次最后的状态,我还是赢了。
可能你已经从上面的例子中想清楚这道题里面的技巧了。如果要想抢到10,就需要抢到7,接下来要抢到4,1。不论谁先选择,只要抢到4,你就可以控制整个过程。针对面试题,如果要抢到20,先要抢到17,接下来是14,然后抢到11,8,5,2。所以对于这道面试题,只要第一抢到2,他就赢定了。
这道看似是智力题主要考察面试者的什么技能呢?就是对计算机递归思想的理解。一般人,让他们数数,数到20。他们会从小往大数,但这道题解题思路正好相反,它要寻找到20,先要找到17,接着14等等。这就是递归的思想。
递归思想不仅用在计算机中,在我们做事情的时候也可以采用。比如开发需求的排期,有两种思路。一种是按时间顺序评估每个任务的所需时间,首先后台开发要一周时间,前端开发需要一周,测试需要一周,最后在某月某日上线新功能,这是一种做法。
还有一种做法就是从后往前推,倒逼。首先确定新功能要在双十一上线,那么11月4日必须开始测试,10月30日前端必须启动开发,然后再倒推后台开发的时间。
哪种方法更有效呢?往往是后者。如果按照第一种方法,会发现很多事情根本不可能在规定时间完成,因此最后一项任务的时间往往被挤压。如果按照递归思想,从结果往前倒推,就顺利很多。
工作中我们通常所说的“结果导向”,其实也包含着倒推的含义在其中。如果要实现达到预期的结果,我们该从哪几个维度考虑,每个维度有需要哪些资源和人力的支持,等等。
吴军老师曾提到,人类的认识受到我们生活空间的局限,因此习惯于从小到大渐渐扩展的思维方式。文中提到的递归思想,并不是要求你去学习计算机知识,而是借用计算机知识,给我们提供一个新的看问题的方法和解决问题的思路,也即倒推的思想。通过实践倒推思想,我们可能会发现,很多事情不是真的非要做,很多事情根本做不完就必须舍弃,很多事情远比想象中更关键。
正如吴军老师在很多场合讲过,如果我们是向死而生,我们就会懂得舍弃,懂得做减法的道理。