通过递归实现全排列

做数学相关的我习惯性就是从定义出发,虽然全排列很简单还是要啰嗦一下。

全排列的定义:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

公式:全排列数f(n)=n!(定义0!=1)。

具体思路:

1.假设现在有从1~n个数字。首先要理解全排列的第一个数字就是从这n个数字里任选一个,然后第二个数字从剩下n-1个数字中任选一个以此类推。。。然而我们没有那么完美的随机函数,只能够选择去遍历。

2.遍历的过程中肯定会遇到重复的情况,怎么办呢!

3.为了避免重复就需要对已经选过的数字进行判断,如果遇到了前面已经选到的就跳过,去选择那些没有选到过的。这样也实现了全排列。

接下来就是代码实现了。

                                       通过递归实现全排列_第1张图片

代码如下:

#include
using namespace std;
#include

//全排列
void allrank(int r,int *array,int n)
//r是已经排列的元素个数,array是存储数据的数组,n是全排列元素的总个数
{
	int error=true;//用来判断已选的数字在前r个数据中是否存在
	if(r==n)//递归的出口,并对排好的数据进行输出
	{
		for(int k=0;k>n;
    
    array=(int *)calloc(n,sizeof(int));//声明一个动态数组,用来存储这n个数
    
    allrank(0,array,n);//递归函数
	return 0;
}

over ! ! !

你可能感兴趣的:(c语言,c++)