第四章 函数和递归 学习笔记

第四章函数和递归

自定义函数和结构体

  1. 执行函数遇到了return 语句会直接推出这个函数。但是如果,没有return 语句,则会返回一个不确定的值。
  2. 算法竞赛中,main()函数的返回值总是0。
  3. 一个函数也可以调用其他的函数
  4. 即使最终答案在所选择的数据类型范围之内,计算的中间结果仍然有可能溢出。
  5. 题目“暗示”的方法要好好思量,有可能有坑,所以这时候要深入的分析题目,不能贸然行事。看似简单的题目才是最为致命的题目。
  6. 对复杂的表达式尝试着进行化简,减少计算量,能有更大几率的避免中间结果有溢出。
  7. 谓词 :判断一个事务是否具有某一性质的函数。最好将谓词命名为 is_xxx 的形式,一目了然。
  8. 对于编写的函数,尽量做到能够正确的计算所有的合法参数 ,如果函数有缺陷,一定要清楚的标明,避免误用。

函数的调用与参数的传递

  1. 注意作用域,A函数的形参和局部变量不能访问B函数的局部变量。另外要注意的是,传值和传递值这两个的区别。

  2. 调用栈 :C语言中用来描述函数之间的调用关系。调用栈的理解对今后的学习和编程至关重要!

  3. 一个字节的地址称为变量的地址,C语言的变量都是放到内存中的,每一个字节都有一个称为地址的编号。

  4. *aa指向的变量,而不是a指向变量所拥有的值。所以(*a)++ *a = *a+1 他们表示的意思是 a 所指向的变量自增1。

  5. * 的优先级低于 ++ 所以,*a++(*a)++ 所表达的意思是完全不一样的。

  6. 不要滥用指针,易造成混乱。

  7. 当数组作为参数传递给函数时 : 将数组的首地址和数组的大小传入函数即可;例如: int sum(int *a ,int n) 其中,a是数组的首地址,n是数组的大小。

  8. 除了把数组的首地址作为实参外,还可以利用指针加减法把其他元素的首地址传递给函数。a++ 则表示,此时a指针指向了a[1]

  9. 对于处理数组的函数来说,如果要从a[0]运算到a[n],最长见的方法就是将数组的首地址和尾地址作为参数传入函数。例如:

    //计算数组的元素和
    //解法一:
    int sum(int* begin, int* end){
        int n = end - begin;
        int ans = 0;
        for(int i = 0; i < n; i++){
            ans += begin[i];
        }
        return ans;
    }
    
    //解法二,推荐使用且最普遍使用的写法
    int sum (int* begin,int* end){
        int *p = begin;
        int ans = 0;
        for(int *p = begin ; p != end;p++){
            ans += *p;
        }
    }
    
  10. 将数组作为指针传入函数,数组的内容是可以修改的

把函数作为函数的参数

  1. 排序问题就是将函数作为函数的参数传递的一个非常典型的应用!
  2. 指向常数的“万能”指针:const void * 它可以通过强制类型转换变成任意类型的指针。
  3. stdlib.h 中的qsort函数就是一个将函数作为参数传递的例子
    void qsort(void * base , size_t num,size_t size , int (*comparator)(const void *,const void * )); 对应的是待排数组的首地址、元素个数、每个元素的大小和一个指向函数的指针。
  4. 在算法竞赛中一般不使用qsort函数,而是使用C++中的sort函数

递归

  1. 函数自己调用自己即递归。
  2. 编写递归函数的时候要注意避免写出无限递归函数,即,要写出递归函数的终止条件。
  3. C语言中,调用自己和调用其他函数并没有本质上的区别。
  4. “段”(segmentation) :“段”是指二进制文件的区域,所有某种特定类型信息被保存在里面。可以用size程序得到可执行文件中各个段的大小
  5. “正文段”用于储存指令,“数据段”用于储存已经初始化的全局变量,“BSS段”用于储存未赋值的全局变量所需的空间。
  6. 调用栈所在的段则称之为“堆栈段”,同样,它也有自己的大小,不能被越界访问,如果越界,则会出现段错误

竞赛题目例题笔记

  1. 自项向下编程即编写程序时,先写出框架,再写细节。
  2. 自底向上编程即编写程序时,先写函数,再写主程序。
  3. 自项向下编程对于编写复杂的软件来说有着独特的优势,但是,在竞赛中,采用自底向上的编程方式更加常用。
  4. 尽量减少全局变量的使用;变量名的选取不能和库函数相冲突。

练习题还没开始刷,捣鼓java大作业中

原文地址:https://www.cnblogs.com/Miubai-blog/p/12834757.html