//《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循环,进行调换,然后程序再次分为二条线。依次如此。
//但程序是从上往下的,所以是先把暗线里的全部东西运行完后,再来明线。
//这是博主自己对此项目的见解,尽量以简单的语言说明。
}
}
}
//总结:递归算法,博主耗费了挺大的精力,还是一知半解的状态吧,可能在其他项目中不太能使用,但知道该如何解析,
//但无法运行出来。
#C语言学习笔记#全排列问题(递归算法)
最新推荐文章于 2022-01-04 18:22:17 发布