今天学习了枚举,联合体,递归,重点在于递归,所以从网上找到了一些递归的题目进行练习,毕竟程序员界流传一句话,会用循环的是人,会用递归的是神,哈哈哈

还是按次序进行梳理,第一个枚举,枚举和宏定义很相似,好处就是不易修改,并且可以定下范围,例如在游戏中前后左右就固定用 键盘上的上下左右键表示,而不是用随便的四个按键就能代替;

enum AA{上,下,左,右}; 声明就像这样,AA为枚举类型名,大括号内可以赋任何值,但是不推荐用中文,先不说有些标准内不识别中文的问题,中间的逗号来回切换就很麻烦,大括号内如果不给赋值的话,默认从零开始,依次向后自加1,例如这个声明 上 = 0,下 = 1,左 = 2依次类推。

第二个联合体,联合体和结构体形式上有些相似,比如 联合体名.变量名 可以取到变量的内容等等,但有着本质上的区别,先看声明

 #include<stdio.h>
union AA
{
int a;
char c;
short b;
};

首先就是内存上的区别,联合体共用一个空间,共用体内最大内存变量的空间,例如这个联合体的内存大小就是4个字节,也就是int的字节数

但联合体的用处,我现在暂时只发现了一个,可以用来证明pc个人机的小端存储(其他后续再发掘)

 #include<stdio.h>
union var{
char c[];
int i;
}; int main(){
union var data;
data.c[] = 0x04;//因为是char类型,数字不要太大,算算ascii的范围~
data.c[] = 0x03;//写成16进制为了方便直接打印内存中的值对比
data.c[] = 0x02;
data.c[] = 0x11;
//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节!
//而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x11020304,低位04放在低地址上。
printf("%x\n",data.i);

结果是 11020304   从而证明了pc机低位存低端小端存储的特点;

第三个就是重点  递归  在学习中发现递归的难点在于,逻辑跳跃性大,一般的递归通过下断点调试还勉强可以发现错误,但是稍微复杂的递归就挺费事的了(比如接下来的通过递归实现字符串倒序),但是这么复杂的东西被发明出来还是有好处的,相对于循环来说节约了时间空间,速度快,但由于每一次调用都要开辟新的空间大大浪费了内存空间,而循环正好相反,这个以后可以根据项目特点来选择需要哪种方式。错了这么多题目,我总结出来写递归的两点就是1.肯定有函数的自我调用 2.设置好函数的出口点  ,打一个简单的比方把,如同分配任务,最高级一级级向下传递,一直传递到设置了函数出口点那一级,向逐级向上传递。

有这么一些题目,有对的,有错的,也有想了很长时间没想出来的,都罗列出来,今后作为一种参考

1.递归实现斐波那契数列

 int FBNQDg(int n)
{
if(n == || n == )
return ;
return FBNQDg(n - ) + FBNQDg(n - );
}

2.递归实现阶乘

 int JieCheng(int n)
{
if(n == )
return ;
return n * JieCheng(n - );
}

3.递归实现 字符串字符统计

 int Strlen(char *str)
{
if(*str == '\0')
return ;
return + Strlen(++str);
}

4.通过递归实现一个数 各个位上的数相加(1729   1+7+2+9)

 int DigitSum(int n)
{
if(n == )
return ;
return n % + DigitSum(n / );
}

5.递归实现字符串倒序

 int my_strlen(char * arr)
{
char * end = arr;
while (*end != '\0') {
end++;
}
return end - arr;
}
void reverse_string(char * arr)
{
int len = my_strlen(arr);
int tmp = arr[];
if (len <= ) {
return ;
}
arr[] = arr[len - ];
arr[len - ] = '\0';
reverse_string(arr + );
arr[len - ] = tmp;
}

对了,递归有个最大的特点就是简洁(一般短小的都精悍)

2019-05-06 23:32:01 编程小菜鸟自我反省,大佬勿喷,谢谢!!!

5-6 c语言之【枚举,联合体,递归】的更多相关文章

  1. 黑马程序员——C语言基础 枚举 宏定义 自定义 static exterm

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)枚举 1)枚举类型的定义 枚举是C语言中的一种基本数据类型,并不是构 ...

  2. C# Arraylist + struct 综合练习 枚举ENUE 递归

    枚举类型 一组常量的组合, 在不制定任何索引的情况下,默认第一个字段从0开始,之后的依次+1 在指定了某个索引的情况下,之后的依次+1 若之前定义的某字段的索引指向了之后的某个默认字段,那么他俩完全相 ...

  3. [C语言 - 8] 枚举enum

    枚举是c语言中得一种基本数据类型,不是数据结构 用于声明一组常数 1. 3中枚举变量的方式 a. 先定义类型, 再定义变量 b. 同时定义类型和变量 c. 匿名定义 enum Season {Spri ...

  4. C语言数据结构----栈与递归

    本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...

  5. c语言的枚举(遍历枚举)与数据类型总结

    一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型. 比如,你可以用一个枚举类型的变量来表示季节, ...

  6. Go语言学习之4 递归&闭包&数组切片&map&锁

    主要内容: 1. 内置函数.递归函数.闭包2. 数组与切片3. map数据结构4. package介绍 5. 排序相关 1. 内置函数.递归函数.闭包 1)内置函数 (1). close:主要用来关闭 ...

  7. C语言之枚举数据类型

    枚举数据类型概述:1.枚举类型是C语言的一种构造类型.它用于声明一组命名的常数,2.当一个变量有几种可能的取值时,可以将它定义为枚举类型.3.枚举类型是由用户自定义的由多个命名枚举常量构成的类型,其声 ...

  8. c语言:函数的递归调用

    c语言可以将代码模块化,这是其很重要的一个特性. 说道代码模块化,我们很自然的就会联想到函数.而函数中,比较难的一个知识点就是函数的递归调用. 值得注意的是,函数的递归调用在现实工作并不是很常用,但是 ...

  9. 【ACwing 93】【模版】非递归实现组合型枚举——模拟递归

    (题面来自ACwing) 从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案. 输入格式 两个整数 n,m ,在同一行用空格隔开. 输出格式 按照从小到大的顺序输出所有方案,每行1个 ...

  10. 嵌入式-C语言基础:联合体和共用体的概念

    有时候同一块内存空间存放类型不同,不同类型的变量共享一块空间. 结构体和共用体的区别: (1)结构体元素有各自单独空间,共用体元素共享空间,空间大小由最大类型确定. (2)结构体元素互不影响共用体赋值 ...

随机推荐

  1. FLUENT多相流问题后处理中如何显示其中一相的分布【转载】

    转载自:http://blog.sina.com.cn/s/blog_6a5314cf0100tnsz.html 多相流问题后处理中很容易显示相界面在某些面上的形态,如图1所示.其实利用ISO-Cli ...

  2. elasticsearch java插入索引批量操作

    1.单条所以插入//第一个参数:索引名:第二个参数:索引类型:第三个参数:索引ID(相同的id时修改数据,默认为随机字符串)IndexResponse indexResponse = client.p ...

  3. 爬虫界的福利--touchRobot,机器模拟触碰滑动库(已开源)

    此插件能干什么? 一句话概括:通过程序主动触发移动端滑动.拖拽.触碰等操作 插件有什么用呢? 可以用于爬虫,也可以用于自动化测试以及程序演示 插件演示地址 (从网上扒了一个canvas绘图的demo, ...

  4. redis之为什么redis是单线程?

    官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽.既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的 ...

  5. arcgis python 发送邮件

    import arcgisscripting, smtplib, os, sys, traceback from email.MIMEMultipart import MIMEMultipart fr ...

  6. python3 与linux间的小知识

    1  1秒启动一个下载器 python -m http.server laso@laso-beta03 ms_product]$ python3 -m http.server Serving HTTP ...

  7. 项目管理工具-OmniPlan 3 for Mac

    链接:https://pan.baidu.com/s/1tp_37fHXHwJuklL1nNSwig  密码:l0sf 激活迷药(里面自带的keygen不能用,用这个好使): Name: Appked ...

  8. 【原创】主机不能访问虚拟机CentOS7中的站点

    主机不能访问虚拟机CentOS7中的站点 ================================ 虚拟机上装好了centos7,并配好了nginx+php+mysql,但是本机就是无法访问. ...

  9. 23 Flutter官方推荐的状态管理库provider的使用

    加群452892873 下载对应21可文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^ flutter_swiper: ...

  10. spring-core-5.0.6.RELEASE-sources.jar中java源代码不全

    笔者最近在调试一段代码,进入spring-core以后,IDEA帮我反编译出源码,其中MethodProxy.java如下 // // Source code recreated from a .cl ...