【从浅到深的算法技巧】1.基础编程模型

1.算法

编写一段计算机程序一般都是实现一种已有的方法来解决某个问题。这种方法大多和使用的编程语言无关一它适用于各种计算机以及编程语言。是这种方法而非计算机程序本身描述了解决问题的步骤。在计算机科学领城,我们用算法这个词来描述一种有限、确定、有效的并适合用计算机程序来实现的解决问题的方法。算法是计算机科学的基础,是这个领城研究的核心。
要定义一个算法,我们可以用自然语言描述解决某个问题的过程或是编写一段程序来实现这个过程。如发明于2300多年前的欧几里德算法所示,其目的是找到两个数的最大公约数:欧几里德算法
计算两个非负整数p和q的最大公约数:若q是0,则最大公约数为p。否则,将p除以q得到余数r, p和q的最大公约数即为q和r的最大公约数。

Public static int gcd(int p, int q)
if (q==0) return p;
int r=p%q;
return gcd(q, r);

1.1 基础编程模型

描述和实现算法所用到的语言特性、软件库和操作系统特性总称为基础编程模型。

我们学习算法的方法是用Java编程语言编写的程序来实现算法。这样做是出于以下原因:

1.程序是对算法精确、优雅和完全的描述;
2.可以通过运行程序来学习算法的各种性质;
3.可以在应用程序中直接使用这些算法。
相比用自然语言描述算法,这些是重要而巨大的优势。

这样做的一个缺点是我们要使用特定的编程语言,这会使分离算法的思想和实现细节变得困难。我们仅使用了Java的一个子集。尽管我们没有明确地说明这个子集的范围,但你也会看到我们只使用了很少的Java特性,而且会优先使用大多数现代编程语言所共有的语法。

1.1.1 Java 程序的基本结构

一段Java程序(类)或者是一个静态方法(函数)库,或者定义了一个数据类型。要创建静态方法库和定义数据类型,会用到下面五种语法,它们是Java语言的基础,也是大多数现代语言所共有的。

  1. 原始数据类型:它们在计算机程序中精确地定义整数、浮点数和布尔值等。它们的定义包括取值范围和能够对相应的值进行的操作,它们能够被组合为类似于数学公式定义的表达式。
  1. 语句:语句通过创建变量并对其赋值、控制运行流程或者引发副作用来进行计算。我们会使用六种语句:声明、赋值、条件、循环、调用和返回。
  1. 数组:数组是多个同种数据类型的值的集合。
  1. 静态方法:静态方法可以封装并重用代码,使我们可以用独立的模块开发程序。
  1. 字符串:字符串是一连串的字符, Java 内置了对它们的一些操作。
  1. 标准输入/输出:标准输入输出是程序与外界联系的桥梁。
  1. 数据抽象:数据抽象封装和重用代码,使我们可以定义非原始数据类型,进而支持面向对象编程。

1.1.2原始数据类型 与表达式

数据类型就是-组数据和对其所能进行的操作的集合。首先考虑以下4种Java语言最基本的原始数据类型:

  1. 整型,及其算术运算符(int);

  2. 浮点型,及其算术运算符(double);

  3. 布尔型,它的值{true, false} 及其逻辑操作( boolean) ;

  4. 字符型,它的值是你能够输人的英文字母数字字符和符号(char).

​ Java 程序控制的是用标识符命名的变量。每个变量都有自己的类型并存储了一个合法的值。在Java代码中,我们用类似数学表达式的表达式来实现对各种类型的操作。对于原始类型来说,我们用标识符来引用变量,用+、-. *、1等运算符来指定操作,用字面量,例如(x+2.236)/2的表达式来表示对值的操作。表达式的目的就是计算某种数据类型的值。

Java程序的基本组成
术语 例子 定义
原始数据类型 int double boolean char 一组数据 和对其所能进行的操作的集合( Java语言内置)
标识符 a abc Absa_b abl23 由字母、 数字、下划线和$组成的字符申,首字符不能是数字
变量 [任意标识符」 表示某种数据类型的值
运算符 + - * / 表示某种数据类型的运算
字面量 程序中出现的数值 值在源代码中的表示
表达式 (15-10)*t 字面量变量或是能够计算出结果的一 串字面量、变量和运算符的组合

​ 只要能够指定值域和在此值域上的操作,就能定义一个数据类型。对于int和double来说,这些操作是我们熟悉的算数运算:对于boolean来说则是逻辑运算。需要注意的重要一点是,+ - * / 都是被重载过的——根据上下文,同样的运算符对不同类型会执行不同的操作。这些初级运算的关键性质是运算产生的数据的数据类型和参与运算的数据的数据类型是相同的。这也意味着我们经常需要处理近似值,因为很多情况下由表达式定义的准确值并非参与表达式运算的值。例如,5/3 的值是1而5.0/3.0的值是1. 66666667,两者都很接近但并不准确地等于5/3。

1.1.2.1表达式

​ 如表所示,Java使用的是表达式一个字面量(或是一个表达式),紧接着是一个运算符,再接着是另一个字面量(或者另- 个表达式)。当一个表达式包含一个以上的运算符时,运算符的作用顺序非常重要,因此Java语言规范约定了如下的运算符优先级:运算符*和/ (以及%)的优先级高于+和一(优先级越高,越早运算) ;在逻辑运算符中,!拥有最高优先级,之后是&,接下来是||。一般来说,相同优先级的运算符的运算顺序是从左至右。与在正常的算数表达式中-一样,使用括号能够改变这些规则。因为不同语言中的优先级规则会有些许不同,我们在代码中会使用括号并用各种方法努力消除对优先级规则的依赖。

1.1.2.2 类型转换

​ 如果不会损失信息, 数值会被自动提升为高级的数据类型。例如,在表达式1+2.5中,1会被转换为浮点数1.0,表达式的值也为double值3.5。转换指的是在表达式中把类型名放在括号里将其后的值转换为括号中的类型。例如,(int)3.7 的值是3而(double)3的值是3.0需要注意的是将浮点型转换为整型将会截断小数部分而非四舍五入,在复杂的表达式中的类型转换可能会很复杂,应该小心并尽量少使用类型转换,最好是在表达式中只使用同一类型的字面量和变量。

1.2.3比较

​ 下列运算符能够比较相同数据类型的两个值并产生一个布尔值: 相等(==)、不等(!=)、小于(<)、小于等于(<=)、大于(>)和大于等于(=)。这些运算符被称为混合类型运算符,因为它们的结果是布尔型,而不是参与比较的数据类型。结果是布尔型的表达式被称为布尔表达式我们将会看到这种表达式是条件语句和循环语句的重要组成部分。

1.1.2.4其他原始类型

Java 的整型能够表示2”个不同的值,用一个32位二进制即可表示(虽然现在的许多计算机有64位二进制,但整型仍然是32位)。与此相似,浮点型的标准规定为64位。这些大小对于-般应用程序中使用的整数和实数已经足够了。为了提供更大的灵活性,Java 还提供了其他五种原始数据类型:

64位整数,及其算术运算符(long);

16位整数,及其算术运算符(short);

16位字符,及其算术运算符(char);

8位整数,及其算术运算符(byte);

32位单精度实数,及其算术运算符(float)。

你可能感兴趣的:(从浅到深的算法技巧,算法,开发语言,java,学习方法,c语言)