这章不考,看一下2.1
1 递归算法设计
1.1 递归算法的基本形式
递归两大要素:递归出口、调用本身的函数
1.2 简单0/1背包问题
在递归这打dp的擦边球是吧。
本题每个物品只有质量属性,只需要使放入背包的质量之和恰好为m即可。
递归f(m,n) m为剩余质量,n为正在考虑第几件物品
递归分为以下四种情况:
(1)(出口)n=0时,return m
n
_{n}
n==m;
(2)m
n
_{n}
n=m时,return true;
(3)m
n
_{n}
n<m时,return f(m-m
n
_{n}
n,n-1)&&f(m,n-1) ;
(4)m
n
_{n}
n>m时,return f(m,n-1) ;
其中,f(m,n-1) 是放弃这件物品,f(m-m n _{n} n,n-1)是拿走这件物品,应该容易理解。
1.2 Hanoi塔问题
太经典了,记一下是H(n)=2
∗
*
∗H(n-1)+1即可。
实在不会的看一下下面这个图吧。
1.3 棋子移动
最初状态(第n+1层):
000……0 0 1 1……1 1 1 _ _
第一步:移中间01到最右:
000……0 _ _ 1……1 1 1 0 1
第二步:移右面的11到中间(第n层):
000……0 1 1 1……1 _ _ 0 1
此时不看右面的01,就到了下一层,0和1的分割线向左移一位。
递归公式:f(n)=f(n-1)+2
1.4 n个元素全排列
这个分析部分书上写的还不错
递归代码range(a,k,n) //求数组a的第k到第n个元素的全排列
每层都将k到n的元素放到第k个位置上(for循环),去递归range(a,k+1,n)到下一层 ,到最后一层统一输出,那么每层的计算量应该是n-k+1。
1.5 自然数拆分
把他看成完全背包问题,背包总质量就是要拆分的自然数,每一个小于等于背包总质量的自然数都是可以选择无限个的物品。
第i个物品,剩余质量为m,函数返回值为拆分种类
f(i,m)=f(i+1,m)+f(i+1,m - i)+f(i+1,m - i
∗
*
∗ 2)+……+f(i+1,m - i
∗
*
∗ k),其中k为使m - i
∗
*
∗k≥0的最大值。
2 递归关系式的计算
2.1 递推关系式的计算
这几年一直在考,虽然高中知识也能做,但是最好还是按这种阴间写法比较稳妥(虽然阴间了点但是应该可以理解吧)。
2.2 台阶问题
因为T(n-2)≤T(n-1),所以T(n)≤2T(n-1),最后得出时间复杂度O(2
n
^n
n)。
可以看看这个理解一下