递归

分治

分治法的三个步骤

  1. 分解:将原问题分解为和若干原问题拥有相同或者相似结构的子问题
  2. 解决:递归求解所有子问题。如果存在子问题的规模小到可以直接解决,就直接解决它。
  3. 合并:将子问题的解合并为原问题的解。

注意:分治法分解出的子问题应当是相互独立,没有交叉的。

分治法作为一种算法思想,既可以使用递归的手段来实现,也可以使用非递归的手段来实现,可以是具体情况来定,一般来说,使用递归实现较为容易。

递归

递归逻辑中的两个重要概念:

  1. 递归边界
  2. 递归式(护着成为递归调用)

求解n的阶乘

#include
using namespace std;
int F(int n)
{
	if(n==0) return 1;
	else return F(n-1)*n;
}
int main()
{
	int n;
	cin>>n;
	cout<

求斐波那契数列的第n项

#include
using namespace std;
int F(int n){
	if(n==1||n==0) return 1;
	else return F(n-1)+F(n-2);
}
int main()
{
	int n;
	cin>>n;
	cout<

输出1~n这n个整数的全排列

#include
using namespace std;
const int maxn=11;
int n,index,P[maxn],hashTable[maxn]={false};
void generateP(int index)
{
	if(index==n+1)
	{
		for(int i=1;i<=n;i++)
		{
			cout<<P[i];
		}
		cout<<endl;
	}
	for(int i=1;i<=n;i++)
	{
		if(hashTable[i]==false)
		{
			P[index]=i;
			hashTable[index]=true;
			generateP(index+1);
			hashTable[index]=false;
		}
	}
}
int main()
{
	cin>>n;
	generateP(1);
	return 0;
}

N皇后问题(朴素法)

int count=0;
void generateP(index)
{
	bool flag=true;
	if(index==n+1)
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=i+1;j<=n;j++)
			{
				if(abs(a-b)==abs(P[i]-P[j])) flag=false;
			}
		}
		if(flag==true) count++;
		return ;
	}
	for(int i=1;i<=n;i++)
	{
		if(hashTable[i]==false)
		{
			P[index]=i;
			hashTable[i]=true;
			generateP(index+1);
			hashTable[i]=flase;
		}
	}
}

N皇后问题(回溯法)

int count=0;
void generateP(int index)
{
	if(index=n+1)
	{
		count++;
		return; 
	}
	for(int i=1;i<=n;i++)
	{
		if(hashTable[i]==false)
		{
			bool flag=true;
			for(int j=1;j

你可能感兴趣的:(递归)