C语言的数字全排列(递归)
题目:输入一个数n,输出1-n的全排列
样例输入
3
样例输出
123
132
213
231
312
321
思路:
1.起步:对数字进行全排列时,从1-N,中间经过的数进行排列,利用递归从第一位数开始排序,直至排到第n+1个数(这时前n位数已经被排好,可以进行输出),
2.返回:因为void没有返回值,我们也不需要返回值,从上一个函数开始进行,l将标记清洗以取出第N位数字,这时函数循环结束无法排序,再次回到上个函数,靠上面步骤取出第二位数字,这时循环未结束可以排列…其他的问题都在程序里标好了。
3.要点:理清楚递归返回之后,用i的值来进行排序,p的值来控制位数,c数组是定位数字是否存在,存在的位置不一定是等于p
程序如下:
#include <stdio.h>
int n;
int v[30];
int c[30];
void fun( int p )
{
int i;
if(p == n + 1)//最大位数,也是首位数的最大值
{
for( i = 1 ; i <= n ; i ++ )//输出各位数
{
printf( "%d", v[i] ); //v[i]代表i位数的数字
}
printf( "\n" ); //进行换行
}
for( i = 1 ; i <= n ; i ++ )//主要是:循环递归,进行不同的排列
{
if( ! c[i] )//判断该数组内是否有值
{
v[p] = i;//给无值者赋值
c[i] = 1;//进行标记——该位数已有值
fun( p + 1 );//给下位数赋值
c[i] = 0;//清洗标记——给下个排列数运行,也可以说取出数字;
}
}
}
int main()
{
scanf( "%d", &n );
fun( 1 );//从1开始直到N个数
return 0;
}
ps:我写着写着也有点迷,不过这些理解希望能帮到你。