Posted on:
Last modified:
递归是几乎一些算法的基础。实际上我认为算法题大致可以分为两类:递归和其他。
实际上计算机能解的唯二问题:
分治、树、深度优先搜索等等实际上都是递归。
递归的核心思想:明白每个函数能做的事,并相信它们能够完成,千万不要试图跳进细节。
在面试的时候,如果允许写递归(一般是允许的),那一定要写递归解。
对一个给定的问题:
def fact(a, n):
if n == 1:
return a
return a * fact(a, n-1) # or n/2 or whatever...
def fact(a, n):
if n == 1:
return a
h = fact(a, n/2)
return h * h
好多时候,需要编写一个私有的 helper 方法,更改一下函数的签名。对于 Python 或者 JavaScript 的话,直接写一个闭包函数是最好的,也避免了全局变量。
最后推荐一本神书:Algorithms by Jeff Erickson. 这本书全书都是在按照递归的思路讲解。
其它的书和文章的问题在于每个知识点似乎都是孤立的,比如说动态规划就在重点讲解状态转移方程和状态矩阵,而分治就在讲解如何用递归树计算时间复杂度等等。这种讲解方式下,每个知识点之间看不到有什么关联,往往熟悉了这个又忘了那个。实际上这些知识点都是有联系的,所谓的动态规划不过是状态空间搜索的一个巧妙转换,本质上和回溯是一致的,都是递归而已。每个技巧的内核都是一致的,只不过特异化之后有不同的表现,如果你不去抓住内核,通过一个主干把所有知识串联起来,而只看表面现象,那么永远也记不住的。
其他的书就好比盲人摸象,而这本书则是讲解的大象的骨骼结构和肌肉构造。分治和动归这些算法好比是大象的耳朵、尾巴等等部位,可以在外部摸到,而递归则是大象的骨架,虽然摸不到,但是只有画出了骨骼,才能把大象画好。
© 2016-2022 Yifei Kong. Powered by ynotes
All contents are under the CC-BY-NC-SA license, if not otherwise specified.
Opinions expressed here are solely my own and do not express the views or opinions of my employer.
友情链接: MySQL 教程站