zoukankan      html  css  js  c++  java
  • <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

  • 相关阅读:
    Luogu P3919【模板】可持久化数组(可持久化线段树/平衡树)
    线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G
    线段树||BZOJ1593: [Usaco2008 Feb]Hotel 旅馆||Luogu P2894 [USACO08FEB]酒店Hotel
    CF 610E. Alphabet Permutations
    BZOJ 1227: [SDOI2009]虔诚的墓主人
    BZOJ1009: [HNOI2008]GT考试
    BZOJ3674: 可持久化并查集加强版
    BZOJ3261: 最大异或和
    BZOJ2741: 【FOTILE模拟赛】L
    BZOJ3166: [Heoi2013]Alo
  • 原文地址:https://www.cnblogs.com/Aaaaaalei0612/p/8973728.html
Copyright © 2011-2022 走看看