• c语言中static的作用以及(递归,八大算法原理)


    static在c中的重要作用

    //下面main.a
    char a = 'A';
    
        void msg()
    
        {
    
            printf("Hello
    ");
    
        }
    
        int main(void)    {
    
            extern char a;
    
            printf("%c",a);
    
            (void)msg();
    
            return 0;
    
        }

     隐藏

    • main.a在a和msg的定义前加上static后,main.c中不能访问到他们了,利用这一特性可以在不同文件中定义同名的函数和变量,对于函数来说只有隐藏的作用,而对于变量还多出两个作用

    保持变量内容的持久(全局变量)

    • 存储在静态数据区的变量会在程序开始运行时就完成初始化,且该变量的内存只会分配一次,因此其值在下次调用时仍维持上此的值

    static的第三个作用是默认初始化为0

    • 其实全局变量也有这一属性,都是在静态数据区,内存中所有的字节默认值都是0x00。某些时候可以减少程序员的工作量。

    递归函数代码

    #include <stdio.h> // 告诉编译器printf函数的格式, 声明printf函数
    
    int main(int argc, const char * argv[]) {
        /*
         有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问 第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个 人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人, 他说是10岁。请问第5个人多大?
         
         第一个人得岁数 == 10
         第二个人得岁数 == 第一个人 + 2  // 12
         第三个人得岁数 == 第二个人 + 2  // 14
         第四个人得岁数 == 第三个人 + 2  // 16
         第五个人得岁数 == 第四个人 + 2  // 18
         
         age(n) = age(n - 1) + 2;
         
         */
        
        int result = age(3);
        printf("result = %i
    ", result);
        return 0;
    }
    /*
    递归函数必须满足以下2个特点 1.必须有一个明确的结束标志 2.自己调用自己 */ int age(int n) // 3 2 1 { // 定义结束条件 if (n == 1) { return 10; }else { // return 14; // return 12; return age(n - 1) + 2; } }

    冒泡排序代码

    int main(int argc, const char * argv[]) {
        int number[6] = {21,42,13,56,72,29};
        hjh_short(number, 6);
        int i;
        for (i = 0; i < 6; i ++) {
            printf("%d
    ",number[i]);
        }
        printf("
    ");
        
        return 0;
    }
    /*
     冒泡就是两两比较取大的在前
     */
    void hjh_short(int a[],int n)
    {
        int i,j,temp;
        
        for (j = 0; j < n - 1; j ++) {
            for (i = 0; i < n - 1 - j; i ++) {
                if (a[i] > a [i + 1]) {
                    temp = a[i + 1];
                    a[i + 1] = a[i];
                    a[i] = temp;
                }
            }
        }
    }

    选择排序代码

    // 选择排序就是拿定义k=i,拿a[k]与后面的数比较,a[k]较大时,a[k]>a[j],k = j就互换位置,最后看k=i是否成立,不能再交换了,比冒泡效率高一点
    void choise(int *a,int n) 
    
    { 
    
    int i,j,k,temp; 
    
    for(i=0;i<n-1;i++) { 
    
    k=i; /*给记号赋值*/ 
    
    for(j=i+1;j<n;j++) 
    
    if(a[k]>a[j]) k=j; /*是k总是指向最小元素*/ 
    
    if(i!=k) { /*当k!=i是才交换,否则a[i]即为最小*/ 
    
    temp=a[i]; 
    
    a[i]=a[k]; 
    
    a[k]=temp; 
    
    } 
    
    } 
    }

    快速排序代码

    //快速法定义了三个参数,(数组首地址*a,要排序数组起始元素下标i,要排序数组结束元素下标j). 它首先选一个数组元素(一般为a[(i+j)/2],即中间元素)作为参照,把比它小的元素放到它的左边,比它大的放在右边。然后运用递归,在将它左,右两个子数组排序,最后完成整个数组的排序。下面分析其

    插入排序代码

    //插入法是一种比较直观的排序方法。它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置。把数组元素插完也就完成了排序。

    其他排序算法:http://blog.jobbole.com/11745/

  • 相关阅读:
    一起了解 .Net Foundation 项目 No.7
    一起了解 .Net Foundation 项目 No.6
    一起了解 .Net Foundation 项目 No.5
    一起了解 .Net Foundation 项目 No.4
    一起了解 .Net Foundation 项目 No.3
    实时流式计算系统中的几个陷阱
    DataHub——实时数据治理平台
    聊聊流计算系统中的核心问题:状态管理
    一小时搭建实时数据分析平台
    重大更新!Druid 0.18.0 发布—Join登场,支持Java11
  • 原文地址:https://www.cnblogs.com/xieyunqq/p/5712980.html
Copyright © 2020-2023  润新知