<C> 枚举 联合体 递归

一.枚举

1.枚举是一个类型 一个常量数组

2.关键字:enum

1 enum Week{MON,TUE,WED,THU,FRI,SAT,SUN};

3.声明一个enum Week w 那么sizeof(w)的大小是4

w可以等于以上七个里面中的任意一个 只能在范围之内赋值

默认情况下 不赋值第一个从0开始 MON=0 TUE=1 以此类推

但例如对THU进行赋值 让THU=100 那么FRI就是101

之所以大小是4 因为它就是一个int类型的变量

4.作用:方便代码的阅读

枚举可以用宏来代替 也可以说 枚举也是声明常量的一种方式

 1 #include<stdio.h>
 2 
 3 enum Week {MON,TUE,WED,THU,FRI,SAT,SUN};
 4 enum CaiQuan {JIANDAO,SHITOU = 100,BU};
 5 
 6 int main()
 7 {
 8     enum CaiQuan cq = BU;
 9 
10     switch(cq)
11     {
12     case JIANDAO:
13         printf("%d
",JIANDAO);
14         break;
15     case SHITOU:
16         printf("%d
",SHITOU);
17         break;
18     case BU:
19         printf("%d
",BU);
20         break;
21     }
22 
23     return 0;
24 }

二.联合体

联合体的所有成员共享一块内存 联合体的大小看最大的成员有多大

 1 #include<stdio.h>
 2 
 3 typedef union MyUnion
 4 {
 5     int a;
 6     short b;
 7     char c;
 8     int d;
 9 }MU;
10 
11 int main()
12 {
13     MU mu;
14     int n;
15 
16     n = sizeof(mu);
17 
18     /*mu.a = 10;
19     printf("%d
",mu.b);
20 
21     mu.c = 100;
22     printf("%d
",mu.a);*/
23 
24     mu.c = 1;
25     printf("%d
",mu.a);
26 
27     return 0;
28 }

说明:这段代码输出的时候 是乱码的

因为c是char 只有一个字节 但是a是int类型的 有四个字节

但如果把下面两行注掉 上面注掉的四行放开的话 就可以正常输出 因为a已经被赋过值了

三.递归

1.定义:就是自己调用自己 调用过程执行不止一次

2.递归和循环的区别:速度的话还是要看循环的复杂度 但是递归消耗的空间比较大

3.写递归的注意事项:写递归 一定要把递归的出口设置好

4.例题:

①用递归完成阶乘:

 1 #include<stdio.h>
 2 
 3 int JieCheng(int n);
 4 int JieCheng1(int n);
 5 
 6 int main()
 7 {
 8     int n = JieCheng1(5);
 9 
10     return 0;
11 }
12 
13 int JieCheng(int n)
14 {
15     int i;
16     int value = 1;
17     for(i=1;i<=n;i++)
18     {
19         value = value * i;
20     }
21 
22     return value;
23 }
24 
25 int JieCheng1(int n)
26 {
27     if(n == 1)
28     {
29         return 1;
30     }
31 
32     return n * JieCheng1(n-1);
33 }

理解:5!=5*4!  4!=4*3!  3!=3*2!  2!=2*1!  1!=1

②斐波那契:

n 1 2 3 4 5 6 7 8
Fib(n) 1 1 2 3 5 8 13 21
 1 #include<stdio.h>
 2 
 3 int Fib(int n);
 4 
 5 int main()
 6 {
 7     int n = Fib(8);
 8 
 9     return 0;
10 }
11 
12 int Fib(int n)
13 {
14     if(n == 1 || n == 2)
15     {
16         return 1;
17     }
18 
19     return Fib(n-1) + Fib(n-2);
20 }

③用递归实现strlen:

 1 #include<stdio.h>
 2 
 3 int MyStrlen(char* str);
 4 
 5 int main()
 6 {
 7     int n = MyStrlen("12345");
 8 
 9     return 0;
10 }
11 
12 int MyStrlen(char* str)
13 {
14     if(*str == '')
15     {
16         return 0;
17     }
18 
19     return 1 + MyStrlen(++str);
20 }

理解:char* = 1 2 3

str→1    return:1+MyStrlen(2)

str→2    return:1+MyStrlen(3)

str→3    return:1+MyStrlen()

str→   return:0

原文地址:https://www.cnblogs.com/Aaaaaalei0612/p/8973728.html