C语言的数字全排列(递归)

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:我写着写着也有点迷,不过这些理解希望能帮到你。

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值