搜索技术——排列和递归
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个 }
以上是关于搜索技术——排列和递归的主要内容,如果未能解决你的问题,请参考以下文章