#C语言学习笔记#全排列问题(递归算法)

//《C语言综合项目实战》项目八
//本项目为输入一段已经排序好的数字进行全排列,并且使用递归算法。
#include<stdio.h>//标准的输入输出头文件。
#define N 255//预编译N为255
void shun(int b,int a[N],int c);//自定义函数shun,声明整型变量b,c,整型数组a[N].
int main() {
	int a[N] = { 0 }, b, c;//声明整型数组a[N]并初始化,声明整型变量b,c
	//数组a用于存储用户输入已经排序的数字。
	//b用于存储用户输入的数字的个数。
	//C用于循环遍历。
	printf("请输入你要输入的数字总数:");
	scanf_s("%d", &b);//输入数字的总数。
	printf("请输入数字:");
	for (c = 0; c < b; c++) {//for循环,将输入的数字存储于数组中
		scanf_s(" %d", &a[c]);
	}
	shun(b, a, 0);//使用函数shun,参数为b,a,0.

}
//shun函数为递归算法的主体内容,因为博主对递归算法一知半解,还有点迷糊,所以可能有些许错误,谅解。
//个人认为递归算法,是先将主体一直拆分,拆分成一个个体,一层层深入,达到某种条件后回溯。
//使用遍历二叉树可以更好的理解此项目。。。。
void shun(int b,int a[N],int c) {
	if (c == b-1)//递归的结束条件,因为c是代表着递归的层数,通过达成c==b-1时,则说明此时
		          //已经达到了底层,则将已经排序好的数组输出。b-1是因为数组下标的最大值,则已经填满了数组。
	{
		for (int d = 0; d <b; d++) {//for循环,将数组输出。
			printf("%d ", a[d]);
	   }
		printf("\n");//每输出一组排序好的数组,就提行,能比较好进行查看。
	}
	else//若是c!=b-1,则说明此时,没有达到最底层,则else。
	{
		for (int i = c; i< b; i++)//从刚开始的角度出发,此时c==0,是第一层也是第一步。
		{                           //通过for循环,此时是数组下标为C的数字与数组下标为i的数字进行调换。
			int d = a[c];
			a[c] = a[i];
			a[i] = d;
			shun(b, a, c + 1);//使用函数shun,此时程序可以看做二条线进行运行。
			d = a[i];          //第一条线为明线:把调换过的数字再次调换回来,回溯回去,等于是退回一步,
			a[i] = a[c];      //从另一条路走,因为这条路已经走过了。此时第一次for循环已经实现。
			a[c] = d;         //来到第二次for循环,i变为了1,c还是0,再次调换顺序。
			                   //再次使用函数shun,再将程序分为二条线进行运行,依次如此直到for循环结束。
			                   //明线讲完,现在来到暗线,暗线此时若还是不满足c==b-1的条件,则进行else,
			                   //但此时c为1,不再为0,则意味着,数组里第一位数字是不变的且还是之前调换过的。
			                  //依旧进行for循环,进行调换,然后程序再次分为二条线。依次如此。
			                  //但程序是从上往下的,所以是先把暗线里的全部东西运行完后,再来明线。
			                  //这是博主自己对此项目的见解,尽量以简单的语言说明。
		}
	}
}
//总结:递归算法,博主耗费了挺大的精力,还是一知半解的状态吧,可能在其他项目中不太能使用,但知道该如何解析,
//但无法运行出来。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值