C语言中的预处理指令和递归

 

                C语言中的预处理指令和递归

  上个月就完成了黑马程序员的IOS基础视频教程,还记得刚开始学的时候,什么都不懂,现在学完基础感觉真的很不错!

每天都在期待着去黑马,憧憬着以后的生活。去黑马的路越来越接近了,我真的好兴奋!这些天一直在复习,感觉C语言中的预处理指令和递归都忘得差不多了。

预处理指令:是在编译器把代码编译成0跟1之前就会执行的一些指令。所有的预处理指令都是以#开头的。

  预处理指令分为三种:

  1.宏定义

    用法--如:#define MYINT  int   表示把右边的int 在本代码以下的代码中的int都用MYINT代替,#define是固定写法,MYINT是代替名(宏名),可以随便取名但是宏名一般都以都用大写,或者以k开头。int是被代替者,它可以是数值,任意数据类型,

  2.条件编译

    类似于if语句,如果满足条件就变异以下代码,如果不满足就不进行这段代码的编译。一般情况下原程序中的所有的代码都要进行编译,但有时希望对其中一部分内容只在满足一定条件下才进行编译。即对一部分内容指定编译条件。

    格式:#if(条件)

        语句;

       #elif(条件)  

        语句;

       #else 

        语句;

       #endif--->一定要写,表示结束条件编译!

  3.文件包含

    分两种:一种是‘包含文件目录’,在安装编译软件时,在安装目录下生成的一些目录。大多数会有一个include目录,该目录下是存放编译器提供的头文件。也就是属于系统文件。用法是:#include <包含文件>

        另一种是‘源文件目录’:就是在你编写的程序所存放的目录,即自己写的文件。用法:#include “源文件”

    文件包含的作用:就是将#include后面的文件里内容拷贝到当前文件!

递归----就是指函数自己调用自己

  能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

 

执行过程:递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。
在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。
在编写递归函数时要注意,函数中的局部变量和参数只是局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

 

作用:由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。
 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。