算法
编写一段计算机程序一般都是实现一种已有的方法来解决某个问题。这种方法大多和使用的编程语言无关——它适用于各种计算机以及编程语言。是这种方法而非计算机
程序本身描述了解决问题的步骤。在计算机科学领域,我们用算法这个词来描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法。算法是计算机科学的
基础,是这个领域研究的核心。
1.1 基础编程模型
我们把描述和实现算法所用到的语言特性、软件库和操作系统特性总称为基础编程模型。
我们学习算法的方法是用 Java 编程语言编写的程序来实现算法。这样做是出于以下原因:
程序是对算法精确、优雅和完全的描述;
可以通过运行程序来学习算法的各种性质;
可以在应用程序中直接使用这些算法。
相比用自然语言描述算法,这些是重要而巨大的优势。
1.1.1 Java 程序的基本结构
一段 Java 程序(类)或者是一个静态方法(函数)库,或者定义了一个数据类型。要创建静态方法库和定义数据类型,会用到下面五种语法, 它们是Java语言的基础,
也是大多数现代语言所共有的。
原始数据类型:它们在计算机程序中精确地定义整数、浮点数和布尔值等。它们的定义包括取值范围和能够对相应的值进行的操作,它们能够被组合为类似于数学公式定义
的表达式。
语句:语句通过创建变量并对其赋值、控制运行流程或者引发副作用来进行计算。我们会使用六种语句:声明、赋值、条件、循环、调用和返回。
数组:数组是多个同种数据类型的值的集合。
静态方法:静态方法可以封装并重用代码,使我们可以用独立的模块开发程序。
字符串:字符串是一连串的字符,Java 内置了对它们的一些操作。
标准输入 / 输出:标准输入输出是程序与外界联系的桥梁。
数据抽象:数据抽象封装和重用代码, 使我们可以定义非原始数据类型, 进而支持面向对象编程。
1.1.2 原始数据类型与表达式
数据类型就是一组数据和对其所能进行的操作的集合。首先考虑以下 4 种 Java 语言最基本的原始数据类型:
整型,及其算术运算符 (int)(32位,对应计算机32位系统。占4个字节);
浮点型,及其算术运算符 (double)(64位,对应计算机64位系统。占8个字节);
布尔型,它的值 {true, false} 及其逻辑操作 (boolean)(占一个字节, 有true和false两个选择,对应硬件的 通电和不通电);
字符型,它的值是你能够输入的英文字母数字字符和符号 (char)(16位,占两个字节。在unicode的其中之一utf-8编码中两个字节已经包含了世界上大部分语言。在我
看来其形式类似于key-value 比如 a = 97)。
1.1.2.1 表达式
Java使用的是中缀表达式 : 一个字面量 (或是一个表达式) , 紧接着是一个运算符,再接着是另一个字面量(或者另一个表达式)。当一个表达式包含运算符时,运算符
的作用顺序非常重要,因此 Java 语言规范约定了如下的运算符优先级:运算符 * 和 / (以及 % )的优先级高于 + 和 - (优先级越高,越早运算);在逻辑运算符中, ! 拥有最
高优先级,之后是 && ,接下来是 || 。一般来说,相同优先级的运算符的运算顺序是从左至右。与在正常的算数表达式中一样,使用括号能够改变这些规则。因为不同语言中的
优先级规则会有些许不同,我们在代码中会使用括号并用各种方法努力消除对优先级规则的依赖。
1.1.3 语句
Java 程序是由语句组成的。语句能够通过创建和操作变量、对变量赋值并控制这些操作的执行流程来描述运算。语句通常会被组织成代码段,即花括号中的一系列语句。
声明语句:创建某种类型的变量并用标识符为其命名。
赋值语句:将(由表达式产生的)某种类型的数值赋予一个变量。Java 还有一些隐式赋值的语法可以使某个变量的值相对于当前值发生变化,例如将一个整型值加 1。
条件语句:能够简单地改变执行流程——根据指定的条件执行两个代码段之一。
循环语句:更彻底地改变执行流程——只要条件为真就不断地反复执行代码段中的语句。
调用和返回语句:和静态方法有关, 是改变执行流程和代码组织的另一种方式。
程序就是由一系列声明、赋值、条件、循环、调用和返回语句组成的。一般来说代码的结构都是嵌套的:一个条件语句或循环语句的代码段中也能包含条件语句或是循环语句。
1.1.5 数组
数组能够顺序存储相同类型的多个数据。除了存储数据,我们也希望能够访问数据。访问数组中的某个元素的方法是将其编号然后索引。如果我们有 N 个值,它们的编号则为
0 至 N-1。这样对于 0 到 N-1 之间任意的 i ,我们就能够在 Java 代码中用 a[i] 唯一地表示第 i 个元素的值。在 Java中这种数组被称为一维数组。
1.1.6 静态方法
本书中的所有 Java 程序要么是数据类型的定义,要么是一个静态方法库。在许多语言中,静态方法被称为函数,因为它们和数学函数的性质类似。静态方法
是一组在被调用时会被顺序执行的语句。修饰符 static 将这类方法实例方法区别开来。当讨论两类方法共有的属性时我们会使用不加定语的方法一词。
1.1.8 字符串
字符串是由一串字符(char 类型的值)组成的。一个 String 类型的字面量包括一对双引号和其中的字符, 比如" Hello, World" 。 String 类型是Java的一个数据类型, 但并
不是原始数据类型。