【寒假实习备战day2】递归算法的学习
简单的自我介绍
我是一名双非大二学生,目前学习方向为Java后端,快速学习并学到了springboot,并和实验室的朋友做了一个简单的微信小程序,想在寒假找份有关互联网的实习,打算海投,城市和公司暂时没有特别强烈的意向,我会再次牢固的复习一遍Java整套学习知识,并且开始补充算法知识刷算法题,来备战这次寒假实习,并且想报名参加蓝桥杯Java B组的比赛,希望我的一些学习笔记能为你带来一些帮助。
两种输入输出方式的区别
- printf和scanf,稍微写起来有点长,但速度巨快
- out,稍微写的短一点,但速度稍慢
- 如果输入输出总数小于10^5,两者没什么区别,我们经常用cin和cout来加快写输入输出时间,如果大于则选printf和scanf,避免超时
递归
递归搜索树
结论:所有递归问题如果不是很明白,都可以用一个方法来解决,那就是画出题目其中一个案例的递归搜索树,把复杂问题变成图像问题,更方便去解决抽象问题,通过一个案例图像就可以联想其他案例的解决方法
根据斐波那契数列的定义,来推到出6的斐波那契值,因为f(n) = f(n-1) + f(n-2),f(1) = 1,f(2) = 2,这几个条件可以推出任意一个数的斐波那契值,算到f(1)和f(2)的时候,就要往前回溯值,遇到同一个节点就要相加,直到达到最后一个夫节点算是这个数的斐波那契值为止,由此我们可以写出斐波那契数列的代码形式
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
int f(int n)
{
if(n == 1) return 1;
if(n == 2) return 2;
return f(n-1) + f(n-2);
}
int main()
{
int n;
cin >> n;
cout << f(n) << endl;
return 0;
} 简单来说就是函数自己调用自己的过程
一些常用的数学知识
- 2^1到2^10需要知道分别是2,4,8,16,32,64,128,256,512,1024
- 2^20约等于为10^6
- 2^16是65536
- 2^15是32768
- 2^6约等于10^18
经典递归题讲解
先画出其中一种情况的递归搜索树的图,便于理解,进而写出代码
# acwing 92. 递归实现指数型枚举
#include <iostream>
#include <cstdio>
#include <algorithm>
const int N = 16;
int n;
int st[N]; //状态,记录每个位置的当前状态,0表示还没考虑,1表示选它,2表示不选它
void dfs(int u)
{
if(u>n)
{
for(int i = 1; i <=n; i++)
if(st[i] == 1)
printf("%d",i);
printf("\n");
return;
}
st[u] = 2;//第一个分支
dfs(U+1);
st[u] = 0;
st[u] = 1;//第二个分支
dfs(u+1);
st[u] = 0;
}
int main()
{
cin >> n;
dfs(1);
return 0;
}
#实习##双非##算法#题解:我们默认第一个位置是1,进入dfs函数时,先判断是否达到结束条件,如果满足结束条件则输出对应满足条件的值,达到第一个分支时,是该位置不选的情况进行赋值,然后进入下一个位置再继续判断,为了不让子树去影响父树,所以要将该位置恢复到赋值前的状态,这样下一个位置进行判断赋值的时候就不会收到影响了,接着达到第二个分支,是该位置选的情况进行赋值,接下来的过程跟不选的情况是一样的
