作者:disappearedgod
时间:2014-5-13
前言
如果你想迅速复习算法来应付考试或者是面试的话,请看本人的其他博客。递归,尽管简单,却并不是良药。况且,在很多大公司看来,递归是一种非常麻烦并且耗时耗力的算法。诚然,从简单的计算角度来说,递归就是这样的。但是,如果你换一个角度来看看计算机的世界,递归却是不能被忽略的。如果你是一个有着人类智慧的正常人,而非一个为了工作变态的机器人的话,递归无疑是你思考中必不可少的元素。
正文
1. 那些年你曾经追过的递归
从高中起,我们就学过递归函数。还记不记得那些年你舍不得解开的归纳法?
无独有偶,《算大导论》一上来就给出了我们递归式的算法分析。难道是中美之间意识形态的第一次握手么?
说实话,我们应该这么看待这个问题。
计算机就是用来辅助人类思考的机器。现在一直流传着这样的话,我们有时候向前走的太远于是就忘了原点在哪里。计算机的初衷和他的成功点不同,是为了破译密码或者简易计算。所有算法中,递归是最符合这一个原始定义的。当然,在时空所限的今天,我们无法将我们的思想完完全全的融入这个小机器里面,所以我们想了很多方法来将节省。但是,对于时空的分析,递归又恰巧是最能说明问题的。
递归的前提,我认为是,世界都是可以二分的。倘若不能复用,就没有函数的意义。我们看待问题总是尽量的去归纳,总结,从而节省了时间。
2. 递归法
我们把一些想法变成可重复执行的函数和不可重复执行的过程。一个直观的想法就是用递归的方法来进行函数的方法探究。当我们选择递归时候,需要考虑两个问题:一个是要找到递归函数式,另一个是要找到递归边界。对于后面这个问题,给出了如下三个方法。
- 代换法。我们先猜有某个界存在。然后在用数学归纳法证明该猜测的正确性。
- 对会输方法。将递归式转化成树形结构。
- 主方法。给出递归式:T(n)=aT(n/b)+f(n)
2.1 代换法(substitution method)
代换法需要两个步骤
- 猜测解的形式
- 用数学归纳法找出使解真正有效的常数。
Tis:
- 对于特殊边界条件证明来说,有时候不必要考虑T(1) = 1的条件。只需要n>=n0时,证明T(n)<=cnlgn,其中n0是常数。
- 通常的方法不能用来猜测递归式。我们可以用递归树的方法来辅助猜测。
2.2 递归树法(recursive tree)
2.3 主方法(master method)