全排列问题--1
**给出一个数字n,求1~n的全排列
下面是c++实现最简单的版本,求1~3的全排列为例
#include<iostream>
#include<cstdio>
#define max 10
//对于过程递归来说 在函数的设计过程中这要觉得所需要实现的功能就是这个函数的功能 就可以理所当然的调用自己 不要考虑任何的细节 满足条件即可
using namespace std;
void f(int *arr,int m,int n)//从m到n的排列
{
//考虑设计出口问题
// m总是不停的在向后游走的,n是长度,所以最后的位置是n-1 m不可能游到n-1之外去吧,所以m又走到n-1位置的时候
//恰好代表了完成一次全排列的求解 再次声明 不要去考虑细节 整体上合理的就是正确的
if(m>n-1){
// 这就是出口 当m到了n-1的位置时候 表明以某个数为首的全排列计算完成 直接打印即可
for(int i=0;i<n;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
else
for(int i=m;i<n;i++){
//完成交换动作 固定好了第一个数字
int temp=arr[m];
arr[m]=arr[i];
arr[i]=temp;
//对剩下的元素进行全排列
f(arr,m+1,n) ;
//再换回来 进行下一次排列
temp=arr[m];
arr[m]=arr[i];
arr[i]=temp;
}
}
main(){
int arr[max];
int n;
cin>>n
for(int i=1;i<=n;i++){
arr[i-1]=i;
}
f(arr,0,n);
}