博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5-6 c语言之【枚举,联合体,递归】
阅读量:5052 次
发布时间:2019-06-12

本文共 2394 字,大约阅读时间需要 7 分钟。

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

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

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

 

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

1 #include
2 union AA3 {4 int a;5 char c;6 short b;7 };

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

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

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

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

 

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

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

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

1 int FBNQDg(int n)2 {3     if(n == 1 || n == 2)4         return 1;5     return FBNQDg(n - 1) + FBNQDg(n - 2);6 }

2.递归实现阶乘

1 int JieCheng(int n)2 {3     if(n == 1)4         return 1;5     return n * JieCheng(n - 1);6 }

 

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

1 int Strlen(char *str)2 {3     if(*str == '\0')4         return 0;5     return 1 + Strlen(++str);6 }

 

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

1 int DigitSum(int n)2 {3     if(n == 0)4         return 0;5     return n % 10 +  DigitSum(n / 10);6 }

 

5.递归实现字符串倒序

1 int my_strlen(char * arr) 2 { 3     char * end = arr; 4     while (*end != '\0') { 5         end++; 6     } 7     return end - arr; 8 } 9 void reverse_string(char * arr)10 {11     int len = my_strlen(arr);12     int tmp = arr[0];13     if (len <= 1) {14         return ;15     }16     arr[0] = arr[len - 1];17     arr[len - 1] = '\0';18     reverse_string(arr + 1);19     arr[len - 1] = tmp;20 }

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

 

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

转载于:https://www.cnblogs.com/xgmzhna/p/10822956.html

你可能感兴趣的文章
NSEnumerator用法小结
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
文件操作
查看>>
NYOJ-613//HDU-1176-免费馅饼,数字三角形的兄弟~~
查看>>
graphite custom functions
查看>>
一个自己写的判断2个相同对象的属性值差异的工具类
查看>>
oracle连接的三个配置文件(转)
查看>>
Centos下源码安装git
查看>>
控件发布:div2dropdownlist(div模拟dropdownlist控件)
查看>>
[置顶] 细说Cookies
查看>>
[wp7软件]wp7~~新闻资讯,阅读软件下载大全! 集合贴~~~
查看>>
二叉树的遍历问题总结
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
绝对定位
查看>>
dpkg 删除 百度网盘 程序
查看>>
pytho logging
查看>>
看看 Delphi XE2 为 VCL 提供的 14 种样式
查看>>
Python内置函数(29)——help
查看>>
机器学习系列-tensorflow-01-急切执行API
查看>>