下面例举了一些leetcode上面的一些习题,作为前一篇内容的补充。没有涉及到动态规划、分治法的题目,因为那些题目难度都比较大^^。
这些题目主要讲解如何根据书上的三种类型,设计递归算法。对于递归定义,这里选择了一道快速幂的题目;对于递归数据结构,这里超前使用了第7章的二叉树而不是使用之前的链表(线性数据结构使用递归并没有太大的意义,直接使用迭代基本上是很方便了),虽然超前但是应该也很容易明白;对于递归的问题求解方法,这里选择了计算排列、计算组合、计算子集三个经典的问题,以及两道富有实际意义的问题:恢复IP地址、最大的岛屿。
递归的数学表达式定义
计算幂(Pow(x, n))
实现函数double myPow(double x, int n)
,计算 xn 。
将幂写成递归定义,即 f(n) 是关于 f(n−1) 的递推式,对于 f(n)=xn ,可以有
f(n)={
1xf(n−1)n=0n>0
利用这个等式,可以很容易设计出最原始的递归算法,其时间复杂度和迭代计算一样,为 O(n) 。
实际上,
xn={
x(x⌊n2⌋)2(xn2)2n=2k+1,k∈Zn=2k,k∈Z
因此,
f(n)=⎧⎩⎨⎪⎪⎪⎪⎪⎪1x[f(⌊n2⌋)]2[f(n2)]2n=0n=2k+1,k∈Z+n=2k,k∈Z+
因此,根据这样的递推式,不难得出下面的程序。不得不说这道题的测试数据非常极端,包含了