递归打印全排列
递归打印全排列
题目描述:
递归地打印1,2,3,......10这10个数字的全排列,共有多少种可能num
解题思路:
1.用数组存放这10个数字,采用下标的方式访问
2.将第一个位置的数字和后面所有位置的数字进行交换,得到10种结果
3.累计算有10*9*8*7*......3*2*1=10!种情况
程序计算验证
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define Swap(a,b) { int temp = a; a = b; b = temp;} 6 //交换,也可以直接使用C++STL中的swap()函数,但是速度慢一些 7 8 int data[] = {1,2,3,4,5,6,7,8,9,10}; //全排列数据 9 int num = 0; //统计全排列的个数,验证是不是3628800 10 11 int Perm(int begin,int end){ //数组下标 12 int i; 13 if(begin == end){ //递归结束,产生一个全排列 14 //如果有必要,在此打印或处理这个全排列 15 num++; //统计全排列的个数 16 } 17 else{ 18 for(i = begin;i <= end;i++){ 19 Swap(data[begin],data[i]); //把当前第1个数与后面的所有数交换位置 20 Perm(begin+1,end); //操作交换的序列更改成了begin+1,end 21 Swap(data[begin],data[i]); //恢复,用于下一次交换 22 } 23 } 24 25 } 26 27 int main() 28 { 29 Perm(0,9); //求10个数的全排列 30 cout<<num<<endl; //打印出排列总数,num = 10! = 3628800 31 32 return 0; 33 }
总结:
1.递归终止条件是没有位置可换的情况下,begin == end
2.每交换一次,同时也递归了一次,完成了num++
3.交换后一定要恢复准备下一次交换

浙公网安备 33010602011771号