n的全排列递归算法

思路:

可以通过递归的方法把n的全排列问题转化为n-1的全排列问题,逐渐推导到一个数字的全排列,显然一个数字的全排列方式只有一种,下面就展示实现该过程的实现代码:

#include <iostream>
using namespace std;

void swap(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}

void pai_xu(int a[],int m,int n){
	if(m==n){
		for(int i=1;i<=n;i++){
			cout<<a[i];
		}
		cout<<endl; 
	}
	else{
		for(int i=m;i<=n;i++){
			swap(a[i],a[m]);
			pai_xu(a,m+1,n);
			swap(a[i],a[m]);
		}
	}
}

int main(){
	int n,m=1,a[10];
	cin>>n;
	for(int i=1;i<=n;i++){
		a[i]=i;
	}
	pai_xu(a,m,n);
	return 0;
}

下面对代码进行解释:

for(int i=m;i<=n;i++){
			swap(a[i],a[m]);
			pai_xu(a,m+1,n);
			swap(a[i],a[m]);
		}

在这一部分代码是整个程序的核心部分,很多人都是对这里有疑问,在这部分中可以这样理解,m代表着数列的开头,a[i]和a[m]交换既是由a[i]所对应的数字打头阵,由于有for循环的存在,显然1-n都会有机会打头阵,接下来的递归调用就是把n的全排列问题转化为n-1的全排列问题,然后逐步推导,一直到m=n时可以输出第一个排列,这时候程序就会执行上面语句段的第二个交换语句,这个语句的作用是要把原来交换了的排列恢复,让前面的语句再换一个数字打头阵接着又反复进行。

注意:把m理解为数列的开头,上面那句和a[m]交换,理解为把哪个数字换到开头位置,后面的交换理解为换开头数字前恢复排列的作用。

    原文作者:递归算法
    原文地址: https://blog.csdn.net/hero_boke/article/details/58637535
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞