递归算法与搜索

一、递归算法
定义
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还是做题少!做题少!做题少!
决定年轻就要多熬夜!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值