PTA练习题7-2 输出全排列 (20 分)递归法(C语言实现)

**

7-2 输出全排列 (20 分)

**

请编写程序输出前n个正整数的全排列(n<10),并通过9个测试用例(即n从1到9)观察n逐步增大时程序的运行时间。
输入格式:

输入给出正整数n(<10)。

输出格式:

输出1到n的全排列。每种排列占一行,数字间无空格。排列的输出顺序为字典序,即序列a​1​​,a​2​​,⋯,a​n​​排在序列b​1​​,b​2​​,⋯,b​n​​之前,如果存在k使得a​1​​=b​1​​,⋯,a​k​​=b​k​​
并且 a​k+1​​<b​k+1​​。

输入样例:

3

输出样例:

123
132
213
231
312
321

代码部分

#include <stdio.h>
#define YES 1
#define NO 0
int order[10],is_mark[10],n;
//在此使用全局变量,数组order用来存储排序组合,数组is_mark用来标记某一个数是否在排序里被用过,默认没用过(NO)
//注意:函数初始化不要忘 
void recursion(int k)
//递归函数思路:传入的参数k用于表示待填入数字的位序,先判断该位置是否合理(有没有超过n)不合理就输出全部,
//合理就往该位置处填入数字,填完之后,递归调用填下一个位置的数。 
{
	int i;
	//判断。。不合理就代表能填的位置都已经填完了,直接将序列输出就可以了 
	if (k>n){
		for (i=1;i<n;++i)printf("%d",order[i]);
		printf ("%d\n",order[n]);
		return ;
	}
	//否则(合理)就进行往里面填数操作 
	else {
		for (i=1;i<=n;++i){//该for循环用于不断从1开始试每一个数 
			if (!is_mark[i]){//is-mark数组记录的是数i有没有被用过。
				order[k]=i;is_mark[i]=YES;// 如果没有被用过,就将i填入k位置处,将i标记为已经使用 
				recursion(k+1);//递归调用,用于填入下一个位置(k+1)的值 
				order[k]=0;is_mark[i]=NO;//调用结束后把该位置空出来,原来用过的数也取消标记 
			}
		}
	}
}
int main ()
{
	scanf ("%d",&n);
	recursion(1);
	return 0;	
}



本文代码根据该博主的代码改编而来,详情请戳https://blog.csdn.net/weixin_43891469/article/details/85385759

  • 22
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值