搜索技术——排列和递归

Posted h-y-h

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搜索技术——排列和递归相关的知识,希望对你有一定的参考价值。

在计算机系统中,递归是通过嵌套来实现的,涉及指针,地址,栈的使用。

部分例子

1.用STL输出全排列

#include<iostream>
#include<algorithm>//包含sort()和next_permutation()函数
using namespace std;
int main(){
	int data[4]={5,2,1,4};
	sort(data,data+4);//排序,得到最小序列 
	do{
		for(int i=0;i<4;i++)//输出一个排列 
		cout<<data[i]<<" ";
		cout<<endl;
	}while(next_permutation(data,data+4));//把下一个排列放在data中 
	return 0;
} 

  

2.用递归求全排列

#include<bits/stdc++.h>
using namespace std;
int data[]={7,1,2,3,4,5,6,8,9,10,12};//本例子中用到前10个数 
int main(){
	int num=10;
	int i,j,k,m,n,p,q,r,s,t;//10个for循环 
	for(i=0;i<num;j++)
	for(j=0;j<num;j++)
	if(j!=i)//让j不等于i 
	for(k=0;k<num;k++)
	if(k!=j&&k!=i)//让k不等于i,k 
	for(m=0;m<num;m++)
	if(m!=j&&m!=i&&m!=k)//让m不等于i,j,k 
	//最后打印出一个全排列:cout<<data[i]<<data[j].....
}

  

3.递归打印全排列

#include<bits/stdc++.h>
using namespace std;
#define Swap(a,b) {int temp=a;a=b;b=temp;}
                   //交换,也可以直接用c++ STL 中的swap()函数,但是速度慢一些
int data[]={1,2,3,4,5,6,8,9,10,32,15,18,33};//本例子中只用到前面10个数
int num=0;//统计全排列的个数,验证是不是3628800 
int Perm(int begin,int end){
	int i;
	if(begin==end){//递归结束,产生一个全排列 
		num++;//如果有必要,在此打印或处理这个全排列 
	}//统计全排列的个数 
	else
	for(i=begin;i<=end;i++){
		Swap(data[begin],data[i]);//把当前第一个数与后面的所有数交换位置 
		Perm(begin+1,end);
		Swap(data[begin],data[i]);//恢复,用于下一次交换 
	}
} 
int main(){
	Perm(0,9);//求10个数的全排列 
	cout<<num<<endl;
}

  

4.打印n个数中任意m个数的全排列

例如,在10个数中取任意3个数的全排列,在Perm()中只修改一个地方就可以了:

if(end==3){            //把perm()中的end改为3即可,其他都不变
cout<<data[0]<<data[1]<<data[2]<<endl;  //打印10个数中3个数的全排列
num++;                                                      //统计全排列的个数,应该是10*9*8=720个
}

  

 

以上是关于搜索技术——排列和递归的主要内容,如果未能解决你的问题,请参考以下文章

具有多个列表的递归排列

深度优先搜索 - 简单demo

从搜索文档中查找最小片段的算法?

c++dfs求全排列,求详细解释

Python按整数递归排列并返回一组元组

堆的算法排列 JavaScript 和递归的堆栈?