一、什么是全排列
从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。
当m=n时,所有的排列情况叫全排列。
二.递归
递归的基本思想就是某个函数直接或者间接的调用自身,就叫做递归。
递归的两个关键
1.判断条件
递归其实就是在一个函数内部继续调用这个函数,所以必须有一个判断条件来判断这个递归在什么条件下结束,不然就会一直递归下去,导致溢出。
2.递归中的变化
每一次函数调用都应该出现参数的变化,使参数向 关键1 中的判断条件靠拢,在一次次的递归中,最后达成判断条件,使递归停止。
例子
#include <stdio.h>
//输入一个整数n,用递归的思想打印出这个整数n的全排列(0<n<10)
void swap(int *a, int *b)//交换两个数字
{
int t = *a;
*a = *b;
*b = t;
}
void rec(int* p, int a, int b)
{
if (a >= b-1)//关键1 判断条件,达成条件后,下面有return;退出递归
{
int i = 0;
for (i = 0; i < b;i++)
{
printf("%d ", *(p + i));
}
printf("\n");
return;
}
int i = 0;
for (i = a; i < b; i++)
{
swap(p + i, p + a);//递推前
rec(p,a+1, b);//关键二, 每次递归时,参数都会向着关键1 的判断条件靠拢直到达成条件
swap(p + i, p + a);//递推后
}
}
int main()
{
int n = 0;
scanf("%d", &n);
int arr[10];
int i = 0;
for (i = 0;i < n; i++)
{
arr[i] = i + 1;
}
rec(arr, 0, n);
return 0;
}
递归在全排列中的思想就是每一次递归都会陷入一个迭代,比如有五个数字,那么第一层递归就会迭代第一个数字,让它从1变到5,然后在变的过程中,刚开始第一个数字是1,然后进入第二层递归,再将第二个数字限制为一个数,比如2,然后进入第三层递归,再将第三个数字固定了,直到第4层递归,限制完第四个数字后,就不用进入递归了,因为总共就五个数字,限制了前四个,第五个也出来了,然后就可以设置一个条件,到达第四层递归后开始迭代,和第五个数的值进行交换,然后退到第三层递推,将第三个数字进行迭代,就先和第四个数字换位置,再进入第四层递归,再退回第三层递归,将第三个和第五个数字进行交换。后面的也就像这也去递推就行了,需要注意的是:每次递推前会交换两个数字,递推后还会再交换回来。