算法(三)递归算法

这章不考,看一下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)。
在这里插入图片描述

可以看看这个理解一下在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值