C语言学习(二十四)---递归与冒泡排序法

在前面几节的内容中,我们学习了指针的相关概念,至此,指针的内容就暂时告一段落了,今天我们将继续向下学习,主要内容为递归冒泡排序法,好了,话不多说,开整!!!!

递归

递归的定义与使用

在讲述递归之前,我们先介绍一个简单的例子,比如此时我想要求某个数的阶乘,自然我们是可以通过循环来实现的,大家可以自行分析,在此处我们换一个角度进行理解,我们以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;
}

编译运行,可以发现数组已经按顺序排好:
在这里插入图片描述
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器 xiaohu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值