目录
第四章 算法
1.函数
2.直觉算法
3.分支和循环
4.递归
5.算法和上下文
6.面向对象
7.常用算法
1.函数
1.1 函数声明和定义
c++定义指令的方式是定义函数。函数是一个指令段落,一个程序是由若干个函数组成的,每个函数负责一部分的内容,通过函数可以把一个大任务分配成若干小任务,降低编程的难度。
函数定义的语法:
类型 标识符(参数列表){
函数体
}
其中“参数列表”的语法:
类型 标识符,类型 标识符……
类似变量定义,称为“形参”,用逗号分隔,可以有零到n个。
“函数体”可以是0到n条语句,语句可以是变量定义等,还可以我们没有接触过的其他语句。函数体就是生成运行指令的核心内容。
注意,函数并不需要分号结尾。
之前,我介绍过数据定义和数据声明的差别,那么函数的定义和声明有什么区别?
函数声明的形式是去除花括号组后,添加分号结尾。
函数声明的语法:
类型 标识符(参数列表);
1.2 调用函数
调用函数就等于跳转到该函数的第一条指令去执行该函数的指令,当该函数执行完毕后,就跳转回原先调用该函数的地方,继续执行接下来的指令。从形式上看,调用函数的语法是用“实参”代替“新参”的过程,例如:
int F(int a, int b);
以下内容定义在函数作用域内:
int x = 1;
int y = 2;
int z = F(1,2);
其中F(1,2)就是对函数F的实际调用。可见函数F的形参(形式参数,相当于占位符)a,b被实参(实际参数)替换。
1.3 函数的形参的作用
int F(int a, int b)
{
return a + b;
}
函数F的函数体部分,我只写了一句。这个语句的含义是返回(return)a + b的结果。那么a,b是从哪里来的?我们没有初始化a,b,也没有给a,b设定值。a,b的值是从实参中来的。当我们用F( 1, 2 )调用函数的时候,等于定义了以下两条语句:
int a = 1;
int b = 2;
因此,return a+b 等于 return 1 + 2; 等于返回3。形参的作用,在于我们可以让调用方去设定形参的值,而不需要定义函数时就设定函数的值。调用方可以用F(1,2); F(55,23);F(2342,2425);F(12345,67890); 等等实参去调用函数。使用形参,我们可以根据不同的实参,得到对应的结果,可以去解决一类问题,这类问题都有相同的算法(将参数a+参数b),而不只是针对解决某个参数的特定问题(比如2+3等多少)。
1.4 函数的返回值
int F(int a, int b)的返回值类型就是函数语法中的“类型”部分。假如函数没有返回值,那么可以用void 类型作为占位符。如果函数有返回类型,那么在函数体中,必须要写返回语句,也就是return 符合该返回类型的值; 这里函数F的返回语句是 return 整数;。
1.5 函数作用域
函数内部成为函数作用域,而函数是指令的集合,因此,实际上的指令都是写在函数作用域内的。因此函数作用域和其他比较大范围的作用域,比如程序作用域,文件作用域有很大的不同。函数作用域有许多特权,比如在函数作用域内初始化变量,不需要一定是文字常量,也可以是变量和普通常量。在函数作用域外面的作用域,不能写实际的指令性语句,而只能写简单的分配空间和初始化的定义和不产生实际代码的声明语句(当然定义函数本身除外)。在函数作用域内可以随意写各种复杂指令。
1.6 指令的种类
了解函数的基本定义后,我们专注于函数体中的指令本身。在c++中有几种语句:
一、声明语句,就是不产生实际指令的语句;用于向编译器解释实际定义的规格。
二、数据定义语句,包括初始化语句。在前一章做了深入的学习。
三、表达式。表达式是一个式子,表达式可以相互组合。当表达式遇到分号,就是完整的语句。
四、判断分支语句;
五、循环语句;
语句的解析是从头到尾顺序执行。语句的结尾一般有分号,某些语句有花括号组做结尾,便不需要分号结尾。这些花括号组内的空间实际是块作用域,块作用域产生一个独立的空间,里面的元素独立于外部的函数作用域,也就是你可以在块作用域内定义和外部作用域同名的元素,而不属于重定义。
2.直觉算法
直觉算法就是一眼看过去就能写出来的算法。只要受到基本数学培训的人,都很容易理解的内容。
2.1 算式和代数式
整型和浮点,字符支持以下运算符组成表达式。
end。