一、递归算法
定义:
1、程序直接或间接调运自己的技巧,而直接或间接调用自身的函数称为 递归函数。
2、通常将一个大规模复杂问题层层分化成与原问题相似的小规模问题。
关键点:
将问题向边界条件转化和问题简单化,且寻找递归终止条件,即最简单情况,不可以在使用递归。
做题步骤:
1、分析问题、寻找递归-----缩小问题,公式递归或是循环变化的递归
2、设置边界,控制递归-----return控制结束,或函数有限次递归
3、设计函数,确定参数-----确定参数个数以满足问题与操作。
具体题目
1、可用公式递归
欧几里得算法(gcd):
原理:两个整数的最大公约数等于其中较小的数和两数之和的最大公约数。
god(m,n)
{
if(n==0) return(m);//循环结束条件
else return(gcd(n,m mod n));//缩小规模
}
上楼梯
题目: 可以一次登上 1、3、5台阶,对于某个台阶n,d[n]=d[n-1]+d[n-3]+d[n-5]。
#include<iostream>
using namespace std;
int b[4]={0,1,3,5};
int tage(int a)
{
if(a<0) return 0;
if(a==0) return 1;//边界条件
return tage(a-1)+tage(a-3)+tage(a-5);//公式递归
}
int main()
{
int n;
cin>>n;
cout<<tage(n);
}
2、全排列问题
#include<iostream>//有限循环次数的递归
using namespace std;
void Perm(int list[], int k, int m)
{
if(k==m)
{
for(int i=0;i<=m;i++)
cout<<list[i]<<" ";
cout<<endl;
}
else
for(int j=k;j<=m;j++)
{
swap(list[k],list[j]);
Perm(list,k+1,m);
swap(list[k],list[j]);//细节处理,恢复原状。
}
}
int main()
{
int a[100],n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
Perm(a,0,n-1);
}
二、搜索
定义:
利用计算机高性能有目的和方向性的枚举,从一个状态转移到另一种状态,之后再将的空间遍历,得目标状态。
广度搜索
从初始状态开始,进行状态转移得下层一节点,遍历检查是否存在目标解,若不存在,则继续状态转移得下层一节点。
其过程可以符合队列性质,先进先出。
深度搜索
从初始状态开始,进行状态转移得下一节点,若不是目标解,则继续转移下一节点,直到无法转移则返回上一节点,再进行转移验证。
三、总结
还是老生常谈,对于ACM还是做题少!做题少!做题少!
决定年轻就要多熬夜!!!