对于递归和递推的非常专业的定义和解释在这里就不再copy了,私以为算法的关键是运用和实践,就好比围棋,规则简单但是入门的门槛很高,就算熟练记忆规则也没法下好一盘棋。Likewise,对于算法学习,最关键是有一个算法的惯性在脑子里,这要比熟记定义重要得多,因为这需要深刻的掌握。对于算法的学习需要的是长久的训练和揣摩。无他,唯手熟尔!

一、递归:自身调用自身的一种算法形式。这也是我们平时所说的dfs(深度优先搜索)。

Q1、如何构建递归搜索树?

Q2、当前是递归搜索树的第几层?

Q3、从哪一层开始递归?

Q4、选还是不选?

Q5、如何标记选还是不选的状态?

Q6、边界是什么?即退出递归的条件是什么?

Q7、什么是回溯?

Q8、什么是恢复现场?为什么要恢复现场?

Q9、如何确定枚举的顺序?

做题前思考清楚这些问题,可以说就是入门的第一步!

例一】

从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式

输入一个整数n。

输出格式

每行输出一种方案。

同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。

对于没有选任何数的方案,输出空行。

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。

数据范围

1≤n≤15

输入样例:

3

输出样例:


3
2
2 3
1
1 3
1 2
1 2 3

此题本质:有n个数,而且是以1.2.3.4.5...n的顺序排放,那么某个位置的数字是放还是不放决定了整体的排列。

此题可以用深度优先搜索解决,因为放还是不放这一问题可以抽象成二叉树,深搜就是先序遍历二叉树。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;
const int N=16;
int st[N];//0代表不选,1代表选,2代表空
int n;void dfs(int u)
{if(u>n){for(int i=1;i<=n;i++){if(st[i]==1)cout<<i<<" ";}cout<<endl;return ;}st[u]=0;dfs(u+1);st[u]=2;//恢复现场st[u]=1;dfs(u+1);st[u]=2;
}int main()
{scanf("%d",&n);dfs(1);return 0;}

例二】

把 1~nn 这 nn 个整数排成一行后随机打乱顺序,输出所有可能的次序。

输入格式

一个整数n。

输出格式

按照从小到大的顺序输出所有方案,每行1个。

首先,同一行相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

数据范围

1≤n≤9

输入样例:

3

输出样例:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

此题本质:

n个位置,分别填数。利用递归就是填数的过程。

递归搜索树不一定是二叉树。

要做到不重,可以定义used数组记录。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;
const int N=16;
int n;
int st[N];//0表示未填,1~n表示该填的数
bool used[N];//判断某个数是否已经填了
void dfs(int u)
{if(u>n){for(int i=1;i<=n;i++)cout<<st[i]<<" ";puts("");return ;}for(int i=1;i<=n;i++)//遍历{if(!used[i]){st[u]=i;used[i]=true;dfs(u+1);st[u]=0;used[i]=false;}}}int main()
{cin>>n;dfs(1);return 0;
}

小明开了一家糖果店。

他别出心裁:把水果糖包成4颗一包和7颗一包的两种。

糖果不能拆包卖。

小朋友来买糖的时候,他就用这两种包装来组合。

当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。

你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。

大于17的任何数字都可以用4和7组合出来。

本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式

两个正整数 n,mn,m,表示每种包装中糖的颗数。

输出格式

一个正整数,表示最大不能买到的糖数。

数据范围

2≤n,m≤10002≤n,m≤1000,
保证数据一定有解。

输入样例:

4 7

输出样例:

17

暴力搜索打表

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;bool dfs(int x,int i,int j){if(!x) return true;if(x >= i && dfs(x-i,i,j)) return true;if(x >= j && dfs(x-j,i,j)) return true;return false;
}
int main(){int p,q;cin>>p>>q;int res=0;for(int i=1;i<=1000;i++)//假设大于1000的相当于都有解了{if(!dfs(i,p,q)) res=i;}cout<<res;return 0;
}

2、递推:按照某种策略向后递进,要填充后面的内容往往需要用到前面的内容。

最简单的递推:斐波那契数列

以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列。

这个数列从第3项开始,每一项都等于前两项之和。

输入一个整数N,请你输出这个序列的前N项。

输入格式

一个整数N。

输出格式

在一行中输出斐波那契数列的前N项,数字之间用空格隔开。

数据范围

0<N<460<N<46

输入样例:

5

输出样例:

0 1 1 2 3
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>using namespace std;int main()
{int n,fi[51];fi[1]=0;fi[2]=1;cin>>n;for(int i=3;i<=50;i++){fi[i]=fi[i-1]+fi[i-2];}for(int i=1;i<=n;i++){cout<<fi[i]<<" ";}}

未完待续

【算法反刍】递归与递推相关推荐

  1. 2.3 基本算法之递归变递推 1188 菲波那契数列(2) python

    http://noi.openjudge.cn/ch0203/1760/ """2.3 基本算法之递归变递推 1188 菲波那契数列(2)--3分 http://ybt. ...

  2. 2.3基本算法之递归变递推 1188 菲波那契数列(2)

    http://noi.openjudge.cn/ch0203/1760/ /* 2.3基本算法之递归变递推 1188 菲波那契数列(2) http://ybt.ssoier.cn:8088/probl ...

  3. 2.3 基本算法之递归变递推 放苹果 python

    http://noi.openjudge.cn/ch0203/666/ """ 2.3 基本算法之递归变递推 666 放苹果 http://noi.openjudge.c ...

  4. 2.3基本算法之递归变递推_3525上台阶

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1190 /* 2.3基本算法之递归变递推_3525上台阶 http://noi.openjudge.cn ...

  5. 2.3基本算法之递归变递推_3525上台阶 python

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1190 """ 2.3基本算法之递归变递推_3525上台阶 http:// ...

  6. 贪心、递归、递推以及动态规划算法的分析与对比

    PS:   头一次规规矩矩的按照论文的格式写文章,呵呵.虽然是小儿科的不能再小儿科的东西了..不过..也忽悠了6000多字~~嘿嘿..肯定写的不好,第一次嘛..所以..接受大家一切批评哈!...文章N ...

  7. 算法——递归与递推[蓝桥杯]

    文章目录 递归与递推 递归实现(指数型)枚举 递归实现(排列型)枚举 递归实现(组合型)枚举 补充:DFS的优化-剪枝 递归与递推 递归就是自己调用自己. printf和scanf的速度比cin和co ...

  8. 算法笔记方法论3 递推法与递归法

    你站在桥上看风景看风景的人在楼上看你明月装饰了你的窗子你装饰了别人的梦--卞之琳 递推算法的特点 一个问题的求解需要大量重复计算,在已知的条件和所求问题之间总存在着某种相互联系的关系,在计算时,我们需 ...

  9. 递归,递推,迭代的区别

    递归 程序调用自身的编程技巧称为递归,是函数自己调用自己. 使用递归要注意的有两点: 递归就是在过程或函数里面调用自身: 在使用递归时, 必须有一个明确的递归结束条件, 称为递归出口. 递归分为两个阶 ...

最新文章

  1. 这24个高频存储问题,你一定要知道!如何不停机,安全更换数据库?大厂都怎么做MySQL到Redis同步的?...
  2. SOCKET编程中,select()函数的作用
  3. VHDL | 音乐盒设计(代码类)
  4. 反思网络中的观点:太过杂乱 需要很强的甄别能力
  5. how is Customizing activity launched by ABAP Framework
  6. java自定义线程_Java自定义线程池详解
  7. 单片机外围模块漫谈之二,如何提高ADC转换精度
  8. Final Project Proposal ——陈稳霖
  9. 求$N^N$的首位数字
  10. array_filter移除空数组
  11. 计算机提示无法访问手机tf卡,电脑(手机)无法读取内存卡(存储卡)的解决方法大全...
  12. 批量安装windows系统补丁包
  13. 计算机桌面的内存设置方法,计算机内存不足【处理方法】
  14. WDK学习笔记_区块链项目实现_MAE
  15. NCBI|宏基因组原始数据上传
  16. 商业需求文档该如何去写?
  17. 工作必备Git保姆级教学
  18. 亚信科技笔试java
  19. 2.前端性能优化-web性能指标
  20. Django2.1 translation详解

热门文章

  1. IDC报告:云计算服务仍面临安全性等三大挑战
  2. c语言中exit头文件,C / C ++中的exit()与_Exit()
  3. 头歌数字电路实验-多路选择器应用(logisim)
  4. c# 发邮件时发送会议邀请icalendar包括更新以及取消
  5. [python] 解压7z格式 压缩包 无密码
  6. 原创程序|基于AutoCAD的宗海界址图快速自动化绘制技术
  7. bootstrap layout.css,布局 | Layout
  8. 瑞幸咖啡“起死回生”,商业与资本的“猫鼠游戏”?
  9. mimo-ofdm无线通信技术及matlab实现_华为技术岗直招,17岗可选!
  10. QT:点击按钮实现不同的图像操作代码