码迷,mamicode.com
首页 > 其他好文 > 详细

搜索技术——排列和递归

时间:2019-12-03 19:54:40      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:cpp   嵌套   swap   pre   ati   ret   bsp   out   排列   

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

部分例子

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个
}

  

 

搜索技术——排列和递归

标签:cpp   嵌套   swap   pre   ati   ret   bsp   out   排列   

原文地址:https://www.cnblogs.com/h-y-h/p/11978774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!