我问自己:我真正的掌握递归了吗?什么是递归?为什么会有递归这样的构想?他适合解决哪些问题?在使用递归时需要注意哪些东西?我用递归解决过问题吗?
递归是什么,是递推和回归。输入一个初始值,一方面按照给定的算法慢慢深入,等到符合终止条件了,就层层回溯,返回结果。
例如书上的
float fac(int n)
{
float f;
if(n<0)
{
printf("n<0,data error!");
return -1;
}
else if(n==0||n==1)
f=1;
else
f=n*fac(n-1);
return f;
}
在这个递归算法中,实参传入一个初始值,给定算法是f=n*fac(n-1),终止条件就是if(n==0||n==1).麻雀虽小,五脏俱全。
变量的存储类型:变量根据存储类型可以分为静态存储变量和动态存储变量,或称为静态变量和动态变量。动态变量是在程序运行中根据需要动态分配内存的变量,静态变量是指在程序运行期间分配固定内存的变量。
动态变量主要有:函数的形参、函数内定义非static变量(在函数结束后系统会回收动态分配的内存);
静态变量主要有:函数内定义的static变量、全局变量。(系统不会回收分配给他们的空间,而是继续使用上次分配的空间,所以值得以保存)
extern声明全局变量,从声明处到文件结束都有效。可用于由多个源文件构成的规模较大的程序。
实践了书上的例子。
-----------------------------------------------------------------
数组部分:
在学习前先在脑中回顾一下数组的相关知识。一位数组,二维数组,怎么动态申请内存,数组下标的计算相关问题等。
一些基本的点:字符在存储到字符数组时,会在后面补上\0符号表示字符的结束,wohenshuai有10个字符,但系统自动为这10个字符分配11位内存单元,补上一个\0
-----------------------------------------------------------------
指针部分:
指针当初学的稀烂,希望趁这个机会好好夯实一下指针的基础
基础知识:对于程序中的每一个变量,在编译程序时都要分配一块内存用于存储该变量的值
C语言的指针是专门用来存放内存地址的变量,指针也是一个变量,遵循变量所需要的遵循的原则。指针的赋值就像实参与形参的传递,每一个类型的指针只能指向同类型的变量,例如:char p只能被char a=‘A’指向。
如以下形式:
int *p;
int i=*p;
将一个尚未被赋值的空指针指向一个同类型的变量,根据以往的经验来说这样是很危险的。尝试了一下
编译出现warning:空指针警告
值得一提的是在中断中使用VI编辑时我会习惯性地使用ctrl+s来保存文件,这在linux命令行中是暂停终端,需要ctrl+q:退出这种状态,让终端继续运行。
常用地两个运算符:
&取地址,*取地址所在的内存单元的值。
在写指针例题时重复工作多,找了一下vi编辑器的常用命令:
- 复制粘贴: 按v进入视图模式 d剪切或者y复制 然后p粘贴
- 插入命令: i
- 查找字符串命令: / ,查找多个匹配结果,可以n键向下查找,N向上查找。
- x 删除光标所在的单个字符
- dd 删除一整行(相当于剪切),p 粘贴
- yy 复制单行
- J 删除当前行的换行
- u 撤销
- w 保存不退出
- q 不保存退出
- ! 强制性操作
- 命令行模式下 :set nu显示行数,:set nonu 不显示行数
- 创建多个窗口,vim打开一个文件后,在命令行模式下执行 "sp 文件路径" 命令,再打开一个窗口,sp表示水平切分窗口,vs表示垂直切分窗口。
- 切换窗口:ctrl + WW
程序及结果:
OK!今天先到这,明天早上还有课,fight!