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

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

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. [WEB安全]给BurpSuite设置非本地的网络代理

    目录 0x01 一般情况 0x02 移动端流量抓取 0x03 多重代理的情形 0x04 参考链接 在Web渗透测试过程中,BurpSuite是不可或缺的神器之一. BurpSuite的核心是代理Pro ...

  2. 我的BO之状态控制

    我的BO 1-我的BO之强类型 2-我的BO之数据保护 3-我的BO之状态控制 4-我的BO之导航属性 MIS常有状态 信息管理系统(MIS)常常有流程,一个流程由多个环节构成,不同的环节的流转通过状 ...

  3. CodeForces - 1183E Subsequences (easy version) (字符串bfs)

    The only difference between the easy and the hard versions is constraints. A subsequence is a string ...

  4. js的鼠标右键简单菜单

    实现点击鼠标右键时出来菜单代码如下: 主要运用oncontextmenu事件,oncontextmenu 事件在元素中用户右击鼠标时触发并打开上下文菜单. <!DOCTYPE html> ...

  5. 【Java】LinkedHashMap

    Java LinkedHashMap 标签(空格分隔):Java source-code 总结 1.LinkedHashMap基于HashMap,实现了按插入顺序.LRU,实现方式主要是继承了Hash ...

  6. 设计自用的golang日志模块

    设计自用的golang日志模块 golang的原生日志模块不能满足需求,而开源的第三方包,也不完全够用.用户较多的logrus,却没有rotate功能,这已经是众所周知的.对于运维来说,当然是希望日志 ...

  7. Android:Mstar Android8.0平台音量控制流程

    一.Speaker 音量.静音流程分析 java层音量设置首先调用到的是AudioManager.java中的方法,在这里有两种方法可以设置音量 setStreamVolume 和 adjustStr ...

  8. 123457123457#0#-----com.twoapp.FromPuzzle02--前拼后广--儿童农场拼图游戏jiemei

    com.twoapp.FromPuzzle02--前拼后广--儿童农场拼图游戏jiemei

  9. (八)UML之状态图

    一.概念 状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Act ...

  10. Java中将一个反斜杠转换成两个反斜杠

    代码示例: s = s.replaceAll("\\\\", "\\\\\\\\");