递归打印全排列

递归打印全排列

题目描述:

递归地打印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.交换后一定要恢复准备下一次交换

 

posted @ 2022-09-06 16:19  暖阳的雪  阅读(34)  评论(0)    收藏  举报