1到100求和学算法之循环的秘密(2)
1 引言上一篇文章分析了仅依赖变量定义和加法运算符两个知识点完成1到100求和,虽然能够实现目标,然而仔细分析却发现存在较大问题。文中描述的算法需要定义a1,a2,···,a100共100个变量才能实现加法求和,如此大规模的变量定义是否有必要,如果没有必要如何减少变量定义的个数?2 问题描述1到100求和问题几乎是所有编程语言初学者都会接触到的一个问题,其定义如下,编程实现:1 + 2 + ··· + 100 = ?限制条件:使用尽可能少的变量。3 问题分析引言部分提出了两个问题,首先来分析第一个问题,是否有必要定义这么多的变量呢?要想搞清楚这个问题,前提是要弄明白什么是变量,变量的本质是什么。所谓变量名就是计算机内存地址的一个别名,如下图所示左侧为内存地址,右侧为其对应的变量名。设整型变量int占用的内存大小为4个字节,内存地址起始位置为0x1000的单元此时有整数1,起始位置0x1004的单元存有整数2。通过计算机编程的方式如何访问得到这两个整数,最简单的方式就是直接通过内存地址来访问得到,但是这种方式要求开发者需要时刻牢记程序中每一个变量的起始地址,而且需要知道这个变量的类型。如果程序涉及的变量很少,这种简单暴力的方式可行,但是对于实际应用开发时,动辄成千上万的变量,这种方法就行不通。如何让开发者快速的访问和改变每一个变量的值,成为研究者的重点。与其让开发者牢记毫无规律的纯数字,不然让开发者给这串数字取一个有意义的别名,通过别名实现快速存取指定内存单元的数据。
图1变量与内存地址的对应关系理解了变量的本质以后,可以发现定义变量的目的是该变量对应的内存单元数据在程序运行期间会发生多次变化,这正体现了变量的“变”字。而与之相对应的是不变量即常量,整个程序运行期间内存单元的值不会发生任何改变。算法1仅依赖变量定义和加法运算符实现求和定义a1, a2, ..., a100共100个变量保存1到100这100个,然后直接相加。a1 = 1a2 = 2···a100 = 100sum = a1 + a2 + ··· +a100(上面两处省略号并非程序语言关键词,而是由于空间有限故省略)有了上面分析之后,回到最初提出的问题。结合算法1和其对应的内存单元关系进行分析,前面100行变量的定义和赋值,本质是将1到100这100个整数存储在对应的内存单元。最后一行代码利用CPU的运算器不断的从a1到a100的内存单元取整数实现累加,最后将得到的结果存储在a100对应的内存单元(后面文章将分析CPU执行此操作的具体流程,如感兴趣,欢迎持续关注)。
图2算法1对应的内存单元通过对算法执行流程的分析发现,程序运行期间,a1到a100对应的这100个内存单元并未发生任何的变化,自始至终始终维持着刚开始的初值。这与变量的本质不符,且浪费了较多的内存单元。至此,可以得出结论,算法1定义的这些变量,没有充分体现变量的本质,带来了内存单元空间的大量浪费。关于引言中提出的第二个问题,如何减少变量定义的个数呢?需要定义多少个变量来实现目标呢。预知后事如何,欢迎持续关注本系列文章。主编:王楠岚责编 :Justin能力越强,责任越大。实事求是,严谨细致。(where2go团队)微信号:算法与编程之美