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团队)微信号:算法与编程之美

(0)

相关推荐

  • 【C语言资料更新】共用体联合体

    文/Edward 共用体又称为联合体,它是C语言中的一种特殊的数据类型.它允许用户在相同的内存位置存储不同的数据类型.用户可以定义一个带有多成员的共用体,但是任何时候这些成员都共享同一块内存.举个例子 ...

  • C++指针笔记

    下面随笔给出C++指针笔记. 内存空间的访问方式 通过变量名访问 通过地址访问 指针的概念 指针:内存地址,用于间接访问内存单元 指针变量:用于存放地址的变量 指针变量的定义 例: static in ...

  • vs2008、vs2010、vs2012中查看变量在内存中的内容的方法

    原文链接:http://www.sowsoy.com/topics-516.html点击打开链接 在vs中调试程序的,有时候需要设置断点看某个变量的内容,如果变量是一个指针.数组或结构体,则可以通过查 ...

  • 浅谈浏览器垃圾回收机制

    javaScriipt 使用垃圾回收机制来自动管理内存 js 的回收机制目前分为两种方式:1.标记清除(各大浏览器主流算法)2.引用技术 一: 标记清除 这种算法的思想是给当前不使用的值加上标记,然后 ...

  • 1到100求和学算法之循环的秘密(4)

    1到100求和学算法之循环的秘密(4)

  • 1到100求和学算法之循环的秘密(3)

    1到100求和学算法之循环的秘密(3)

  • 1到100求和学算法之循环的秘密(1)

    1到100求和学算法之循环的秘密(1)

  • 算法|1到100求和学算法之无尽的递归

    引言递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现像.绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归.计算 ...

  • 1到100求和学算法之开篇

    Pascal之父尼古拉斯·沃斯因提出著名公式"算法+数据结构=程序"而荣获1984年计算机领域的最高奖项-图灵奖.通过这个公式,可以发现算法对于程序设计的重要性.然而算法思想的学习 ...

  • 100种学楷书口诀,经典实用,值得细细品鉴

    学书口诀楷书百法 第一法:十字在上横抗肩,竖笔上粗细下端,竖笔书写带撇意,位置写在中心线. 第二法:厂字作头横抗肩,横撇不连更美观,撇如柳叶中间宽,撇笔长写字舒展. 第三法:布字头部横笔长,先撇后横是 ...

  • 100种学楷书口诀,经典实用,值得细细品鉴!

    Ad 三希堂法帖(套装共20册 全新编排 御刻释文) 作者:[清]梁诗正 京东 学书口诀楷书百法 第一法:十字在上横抗肩,竖笔上粗细下端,竖笔书写带撇意,位置写在中心线. 第二法:厂字作头横抗肩,横撇 ...

  • 干货|理解机器学习必学算法条件随机场CRF

    第一时间获取价值内容 一.概率图模型 概率图模型又叫做马尔可夫随机场,是一个可以用无线图表示的联合概率分布.在这个无线图中结点表示随机变量,边表示两个随机变量依赖关系.给定一个概率分布及其无向图,首先 ...

  • 100种学楷书口诀

    学书口诀楷书百法 第一法:十字在上横抗肩,竖笔上粗细下端,竖笔书写带撇意,位置写在中心线. 第二法:厂字作头横抗肩,横撇不连更美观,撇如柳叶中间宽,撇笔长写字舒展. 第三法:布字头部横笔长,先撇后横是 ...