在前面几节的内容中,我们学习了指针
的相关概念,至此,指针
的内容就暂时告一段落了,今天我们将继续向下学习,主要内容为递归
和冒泡排序法
,好了,话不多说,开整!!!!
递归
递归的定义与使用
在讲述递归之前,我们先介绍一个简单的例子,比如此时我想要求某个数的阶乘
,自然我们是可以通过循环来实现的,大家可以自行分析,在此处我们换一个角度进行理解,我们以7的阶乘为例:
从上图中我们可以看到:
每一个等号运算后,都可以将7的阶乘进行化简,也就是先写成7*6!,6!又可以写为6*5!,以此类推,
由此,我们发现这样一个事实:假设我们定义一个名为jiecheng
的函数,那么阶乘实则可以看成是多次调用阶乘函数即:
res = n*jiecheng(n-1)
上述这个过程实则就是递归过程,下面我们完善阶乘的代码,自定义一个函数,用来计算阶乘:
int jiecheng(int n)
{
int res = n*jiecheng(n-1);
n--;
}
这样就写好了吗,显然不是
,因为在这个函数中,我们并没有设置递归终止的条件,这也是使用递归时一定要格外注意的点
,
递归必须有终止条件
那么什么时候终止呢,那么计算阶乘,最低也就是1了嘛,所以当n<1
时就不用进入循环了,设置好限制条件后,完整代码如下:
#include<stdio.h>
int jiecheng(int n)
{
int res = 1;
if(n>1)
{
res = n*jiecheng(n-1);
n--;
}
}
int main()
{
int n = 0;
scanf("%d",&n);
int res = jiecheng(n);
printf("res = %d\n",res);
return 0;
}
编译运行,可以得到以下结果:
可以看到此时我们就使用递归的方式实现了阶乘求解,那么其递归的运算流程是啥样子呢,下面进行介绍。
递归的执行
实际上,在上述的代码中,执行时如下图所示,其中红线为调用时顺序
,绿色为计算单个函数的结果后返回顺序
,图解较为清晰,不再进行赘述。
冒泡排序法
冒泡排序法
,当然是一种用来排序的方法喽,到底什么是冒泡排序法
,大家可以直接看百度喽,附上链接:百度百科
其原理实则很简单
,如下图所示:
上述图片即阐述了一次冒泡排序
,当一次冒泡排序后,最右边的元素就是数组中最大的元素了,此时该元素保持不变,剩余元素依旧照着上述的步骤重复性进行。
从上面可以看到,最开始的时候,需要将相邻的数据均进行比较,那么就需要进行需要比较3对数据
,固定已经排序好的数字后,第二次排序只需要排序2对数据
,然后最后一次只需比较一对
数据,总共进行了3次排序
,因此最外部循环的判断条件应该是
i<sz(数组中元素个数);
而内部循环的判断条件应该是:
数组中元素个数-1-第几次排序;
j<sz-1-i;
比如第一次排序那就是:4-1-0=3,也即进行三次排序,
经过上述的分析之后,就可以写出完整的代码了,如下所示:
#include<stdio.h>
int main()
{
int arr[] = {1,7,5,9,2};
int sz =sizeof(arr)/sizeof(arr[0]);
int i = 0;
for(i=0;i<sz-1;i++) //外部循环:排第几次
{
int j = 0;
for(j=0;j<sz-1-i;j++)//内循环:排几对数据
{
if(arr[j]>arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
编译运行,可以发现数组已经按顺序排好:
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!