递归函数和预处理学习总结

递归学习心得:

递归即是该函数调用它本身自己,这种调用过程称为递归。
递归可以相当于循环,所以想结束递归,就必须有终止递归的条件测试部分,否则就会出现无限递归(即无限循环)。

递归就是某过程以某种方式重复出现,很多“计算”也以某种方式重复出现。

例如:

数学归纳法中的递归:证明一个与自然数n有关的命题P(n),有如下步骤:
(1)证明当n取第一个值n0时命题成立(n0对于一般数列取值为0或1)
(2)假设当n=k(k≥n0,k为自然数)时命题成立,证明当n=k+1时命题也成立。

递归(优缺点)与循环
使用循环的地方都可以使用递归
缺点:
递归快速耗内存
不方便阅读和维护
效率低
优点:
简洁
适合解决阶乘、涉及相反顺序的编程问题

函数的递归调用
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。

递归有直接递归和间接递归

用递归法求解问题时的方法:

列出递归方程/思路
写出递归函数
调用递归函数

递归经典的问题汉诺塔问题

 程序设计分析:用f(n, a, b, c)表示要求解的问题,其含义是有a、b、c三根棒和n只盘,且这n个盘叠放在a棒上,依次叠放为大盘在下,小盘在上。借助b棒将n只盘从a棒移到c棒上。每次只移一个盘,在移动时保持大盘在下,小盘在上。

这个问题理解的时候对我来说还是挺有难度的
 
预处理学习总结
 预处理是指在系统对源程序进行编译之前,对程序中某些特殊的命令行的处理,预处理程序将根据源代码中的预处理命令修改程序。使用预处理功能可以改善程序的设计环境,提高程序的通用性、可读性、可修改性、可调试性、可移植性和方便性,易于模块化。

C语言中以符号"#"开头的命令
(1)宏定义:#define...
(2)文件包含:#include...
(3)条件编译:#ifdef...

 
 宏定义

宏就是替换,其分两类:简单的字符替换和带参数的宏替换。

宏定义语法:#define 标识符字符串
应用法则:原样替换
典型应用:符号常量
典型错误:#definePI3.1415926;

带参数的宏定义
语法:#define宏名(参数表)字符串
例如
#defineS(a,b)a*b,其中a、b为宏的参数

“文件包含”处理
所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来。

 

“文件包含”命令的作用:
“文件包含”命令可以节省程序设计人员的重复劳动
将常用的一组固定常量的定义组成一个文件——方便,易修改
库函数的开发者将对被调用的函数的原型声明写入头文件,程序员只需
要#include<头文件>——大大简化了程序
一行#include,相当于写几十、几百,甚至更多行的内容
“文件包含”是模块化程序设计的产物
便于多个程序员分别编程
将公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头
用包含命令包含该文件即可使用
公用的声明只写一次,除节省时间,更可观的是减少出错

 格式1:#include文件名

格式2:#include"文件名"

(2)功能:用指定的文件名的内容代替预处理命令。

(3)两种格式的区别:

格式1定义时,预处理程序在C语言编译系统定义的标准目录下查找指定的文件。

格式2定义时,预处理程序首先在引用被包含的头文件的源文件所在的目录中寻找指定的文件,如没找到,再按系统指定的标准目录查找。

为了提高预处理程序的搜索效率,通常对用户自定义的非标准文件使用格式2,对使用系统库函数等标准文件使用格式1.

条件编译
一般情况下,在进行编译时对源程序中的每一行都要编译。
条件编译:希望根据需要只编译程序中某一部分
条件编译命令常用在对程序的调试中。

 条件编译的常用形式之一
//define标识符
#ifdef标识符
程序段1
#else
程序段2
#endif

当所指定的标识符已经被#define
命令定义过,则在程序编译阶段
只编译程序段1,否则编译程序段
2。#endif用来限定#ifdef命令
的范围,其中#else部分也可以没
有。

#ifndef标识符
程序段1
#else
程序段2
#endif

条件编译的常用形式之二

#if常量表达式
程序段1
#else
程序段2
#endif

如常量表达式的值为真(非
0),则对程序段1进行编译,
否则对程序段2进行编译。因
此可以使程序在不同条件下,
完成不同的功能。

原文地址:https://www.cnblogs.com/Abreast-/p/7860189.html